PHP数据库编程之一MySQL优化策略概述
本文简单讲述了PHP数据库编程之MySQL优化策略。分享给大家供大家参考,具体如下:
点此加入我的企鹅群 几条MySQL小技巧1、SQL语句中的关键词最好用大写来书写,第一易于区分关键词和操作对象,第二,SQL语句在执行时,MySQL会将其转换为大写,手动写大写能增加查询效率(虽然很小)。 2、如果我们们经对数据库中的数据行进行增删,那么会出现数据ID过大的情况,用 3、对int类型添加 4、导入大量数据时最好先删除索引再插入数据,再加入索引,不然,mysql会花费大量时间在更新索引上。 5、创建数据库书写sql语句时 ,我们可以在IDE里创建一个后缀为.sql的文件,IDE会识别sql语法,更易于书写。更重要的是,如果你的数据库丢失了,你还可以找到这个文件,在当前目录下使用 数据库设计方面优化1、数据库设计符合第三范式,为了查询方便可以有一定的数据冗余。 2、选择数据类型优先级 int > date,time > enum,char>varchar > blob,选择数据类型时,可以考虑替换,如ip地址可以用ip2long()函数转换为unsign int型来进行存储。 3、对于char(n)类型,在数据完整的情况下尽量较小的的n值。 4、在建表时用partition命令对单个表分区可以大大提升查询效率,MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用,分区方式为:
5、选择数据库引擎时要注意innodb 和 myisam的区别。 存储结构:MyISAM在磁盘上存储成三个文件。而InnoDB所有的表都保存在同一个数据文件中,一般为2GB 事务支持:MyISAM不提供事务支持。InnoDB提供事务支持事务。 表锁差异:MyISAM只支持表级锁。InnoDB支持事务和行级锁。 全文索引:MyISAM支持 FULLTEXT类型的全文索引(不适用中文,所以要用sphinx全文索引引擎)。InnoDB不支持。 表的具体行数:MyISAM保存有表的总行数,查询count(*)很快。InnoDB没有保存表的总行数,需要重新计算。 外键:MyISAM不支持。InnoDB支持 索引方面优化1、innodb是聚簇索引,存储索引时必须有主键,如果没有指定,引擎会自动生成一个隐藏的主键,生成一个主索引,索引内存放的是主键的物理地址,数据靠主键存放,每次使用索引时要先找到主索引,然后找到主索引下的数据。
2、myisam的索引各个索引都相同统一指向磁盘上各个行的地址,都是轻量级的指针数据。缺点是各个索引的建立不是通过主键,查询没有聚簇索引查找主键快。但其因为存储的是地址,所以在插入新值时比较方面移动改变。 3、进行多条件查询时,对多条件分别建立索引时,执行sql查询时,MySQL只会选择一个最贴近的索引来使用,所以如果需要多条件查询,要建立联合索引,即使会造成数据冗余。 联合索引的BTREE建立方法:对第一个条件建立索引,在第一个索引的BTREE区域对第二个条件建立索引,以此类推,所以,在使用索引时,不用第一个条件用第二个条件也不会用到联合索引。使用索引时要条件要有顺序,有序列的使用。 4、索引长度对查询也有很大影响,我们应该尽量建立短的索引长度,我们可以使用查询列 5、对于经常修改导致的索引碎片的维护方式:ALTER TABLE tablename ENGINE oldengine;即再次应用一下表存储引擎,使其自动维护;也可以用 OPTIMIZE tablename 命令来进行维护。 数据查询方面优化数据库操作尽量少查询,有查询时尽量不在数据库层面上进行数据操作,而是返回到PHP脚本中操作数据,减轻数据库压力。 一旦发现有数据库性能问题,要及时解决,一般用慢查询日志记录查询很"慢"的语句,用EXPLAIN分析查询和索引使用情况,用PROFILE分析语句执行时的具体资源消耗。 慢查询日志:1、在my.ini或my.cnf的[mysqld]下添加
2、然后在MySQL里设置SET slow_query_log='ON'来开启慢查询。 3、记录下日志后,我们用/bin/目录下的mysqldumpslow filename来查看日志,其常用参数如下:
EXPLAIN语句使用方法,在要执行的查询语句前面加EXPLAIN
得到形如下图的结果: 下面是对每一项的解释: id 查询语句的id,简单查询无意义,多重查询时可以看出执行查询的顺序 select-type 执行的查询语句的类型,对应多重查询,有simple/primary/union等。 tabel 查询语句查询的数据表 type 获得数据的类型 常见的类型效率从高到低为 null>const>eq_ref>ref>range>index>all possible-keys:可能使用到的索引 key 使用到的索引 key_len索引长度 ref 使用哪个列与索引一起从表中选择。 rows 查找到数据要扫描的大概行数,可看出索引的优劣 extra 常见的有 using filesort 查询到数据后进行文件排序,较慢,需要优化索引 using where 读取整行数据后进行判断过滤,是否符合where条件 using index 索引覆盖,即在牵引中已经有这存储了目标数据,直接读取索引,很快。 PROFILE用SELECT @@frofiling来查看PROFILE的开启状态。 如果未开启,用SET profiling=1来开启。 开启之后,再执行查询语句,MySQL会自动记录profile信息。 应用show profiles查看所有的sql信息,结果为 Query_ID Duration Query三列结果,分别是查询ID,用时和所用的sql语句。 我们可以使用
type常见有ALL(全部) BLOCK IO(显示IO相关开销) CPU(CPU开销) MEMORY(内存开销)等 大型存储方面优化数据库主从复制和读写分离1、master将改变记录到二进制日志中,slave将master的二进制拷贝到它的中继日志中,重新将数据返回到它自己的数据中,达到复制主服务器数据的目的。 主从复制可以用作:数据库负载均衡、数据库备份、读写分离等功能。 2、配置主服务器master
3、配置从服务器slave
4、在主服务器上授权从服务器
5、在从服务器上使用
6、然后使用start slave命令开始进行主从复制。 不要忘记在每次修改配置后重启服务器,然后可以在主从服务器上用show master/slave status查看主/从状态。 实现数据库的读写分离要依赖MySQL的中间件,如mysql_proxy,atlas等。通过配置这些中间件来对主从服务器进行读写分离,使从服务器承担被读取的责任,从而减轻主服务器的负担。 数据库的sharding在数据库中数据表中的数据量非常庞大的时候,无论是索引还是缓存等压力都很大,对数据库进行sharding,使之分别以多个数据库服务器或多个表存储,以减轻查询压力。 方式有垂直切分、水平切分和联合切分。 垂直切分:在数据表非常多的时候,把数据库中关系紧密(如同一模块,经常连接查询)的表切分出来分别放到不同的主从server上。 水平切分:在表不多,而表里的数据量非常大的时候,为了加快查询,可以用哈希等算法,将一个数据表分为几个,分别放到不同的服务器上,加快查询。水平切分和数据表分区的区别在于其存储介质上的不同。 联合切分:更多的情况是数据表和表中的数据量都非常大,则要进行联合切分,即同时进行垂直和水平分表,将数据库切分为一个分布式的矩阵来存储。 这些数据库的优化方式,每一种拿出来都可以写作一篇文章,可谓是博大精深,了解并记忆了这些方式,可以在有需要的时候进行有目的的选择优化,达到数据库效率的高效。 点关注,不迷路好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以 点击进入暗号: PHP+「平台」 更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新) 以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |