MySQL(八):慢查询优化

一. 小表驱动大表
类比:Java中嵌套循环应该内大外小,还是内小外大?
https://www.cnblogs.com/gougouyangzi/articles/8858412.html
MySQL(八):慢查询优化_第1张图片
MySQL(八):慢查询优化_第2张图片

二. ORDER BY子句尽量使用Index方式排序,避免使用FileSort方式

CREATE TABLE tblA(
  id int primary key not null auto_increment,
  age INT,
  birth TIMESTAMP NOT NULL,
  name varchar(200)
);
 
INSERT INTO tblA(age,birth,name) VALUES(22,NOW(),'abc');
INSERT INTO tblA(age,birth,name) VALUES(23,NOW(),'bcd');
INSERT INTO tblA(age,birth,name) VALUES(24,NOW(),'def');
 
CREATE INDEX idx_A_ageBirth ON tblA(age,birth,name);

MySQL(八):慢查询优化_第3张图片
MySQL(八):慢查询优化_第4张图片
MySQL 支持两种方式的排序,FileSort和Index,Index效率高。Index值MySQL扫描索引本身完成排序。
ORDER BY满足两种情况,会使用Index方式排序:
a. ORDER BY使用索引最左前列
b. 使用WHERE子句与 ORDER BY子句条件列组合满足索引最左前列
注意: where子句中如果出现索引的范围查询(即explain中出现range)会导致order by 索引失效。

尽可能在索引列上完成排序,遵照索引建的最佳左前缀;
如果不在索引列上,filesort有两种算法:MySQL就要启动双路排序和单路排序,关键参数 sort_buffer_size ,max_length_for_sort_data;
MySQL(八):慢查询优化_第5张图片

三. GROUP BY关键字优化

  • group by实质是先排序后进行分组,遵照索引建的最佳左前缀
  • 当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置
  • where高于having,能写在where限定的条件就不要去having限定了

你可能感兴趣的:(Database)