Order by 优化
根据排序字段建立合适的索引,多字段排序时,也遵循左前缀法则。
尽量使用覆盖索引
多字段排序时,一个升序一个降序,此时是需要注意联合索引在创建时的规则(ASC/DESC)
如果不可以避免fileSort,大数据量排序时,可以适当增大排序缓冲区的大小 sort_buffer_size(默认256k)
show VARIABLES like 'sort_buffer_size'
Group by 优化
在分组操作时,可以通过索引来提高效率
在分组操作时,索引的使用也是满足最左匹配原则
Limit 优化
在分页中,越往后面查询需要消耗的性能越大。其他记录丢弃。查询排序的代价非常大
一般分页查询时,通过查创建覆盖索引,能够比较好的提高性能。可以通过覆盖索引加子查询形式进行优化
Count 优化
MylSAM 引擎把 一个表的总数存在磁盘中因此 使用count(*)的时候会直接返回这个数,效率很高
InnoDB 引擎使用count(*) 需要把数据一行一行读出来,然后累计计数。如果不是null 累加值就加1否则不加
count(*)
innoDB并不会把全部字段取出来,而是专门做了优化,不取值,服务处直接按行累加
count(id)
innoDB引擎会遍历整张表,把每一行的主键I都取出来返回给服务层,服务层拿到主键 直接安行进行累加。
count(字段名)
没有not null 约束 服务层会判断是否为空,不为null 累加
count(1)
innoDB引擎会遍历整张表 但不取值,服务层对于每一行放一个数字1 进去 然后进行累加
按照效率排序的:count(*) > conut(1) > count(id) > count(字段)
Update 优化
innoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则就会变成表锁。