在项目开发的时候难免会写一些SQL语句,刚开始数据量比较小或没预料到数据的增长速度很快,在后期的维护中偶尔会有慢SQL出现,严重的会影响到线上服务正常运行和用户体验。当然慢SQL的优化角度有多种,比如增/减索引、调整搜索条件的顺序、优化查询结果参数、分库分表、读写分离等等,但本篇我们主要谈一下索引优化的方法和套路。

建立索引是数据库查询优化的最重要手段之一,当我们遇到慢SQL情况时,应当优先考虑和分析是不是可以通过优化数据库表的索引结构来解决问题;

这里我们假设表1中有一个联合索引(idx_A_B_C),该联合索引是由3个字段组合而成,那么我们在操作表1进行查询时,怎么才能最优化的使用索引,或者怎么避免索引不起作用呢?

  • 1、查询的时候使用联合索引的全部字段进行精确匹配;
  • 2、使用最左匹配原则;要把使用最频繁的列放到最左段,比如索引idx_A_B_C相当于建立了idx_A、idx_A_B和idx_A_B_C三个索引,当我们查询前3条时都可以用到索引,其他情况则无法使用索引:
  • select * from table_1 where a = ‘a’;
  • select * from table_1 where a = ‘a1’ and b = ‘b1’;
  • select * from table_1 where a = ‘a’ and b = ‘b1’ and c = ‘c1’;
  • select * from table_1 where b = ‘b1’ and c = ‘c1’;
  • select * from table_1 where a = ‘a1’ and c = ‘c1’;
  • 3、范围查询右边的列,不会使用索引;
  • 4、查询字段有运算操作时,不会使用索引;
  • 5、字符串查询时,如果不加单引号,则不会使用索引;(这是由于mysql的查询优化器会进行自动类型转换,类型变了,导致索引失效)
  • 6、查询的字段尽量都是建立索引列字段;
  • 查询字段仅是索引字段时,一是会利用索引;二是不会回表查询。查询速度快;
  • 7、尽量避免使用"or"语句连接查询;
  • 这是由于如果or前的查询字段有索引,而or后的字段没有建立索引时,整个查询语句所涉及到的所有都不会启用;
  • 如果or前后的查询字段都使用索引,则涉及到的作用会起作用;
  • 8、避免使用%作为模糊查询的开头,否则会引起索引失效;
  • %在结尾处则索引不会失效;
  • 9、查询语句中如果要对某个字段进行有限范围查询时可以使用in语句,in语句查询走索引;而not in语句则不走索引;
  • 10、建立索引的字段应有区分度,否则有可能索引失效;
  • 假如有索引idx_c,其中字段c代表性别,table_1表中有100条数据,99条是女,1条是男:
  • select * from table_1 where c = ‘男’ ;会走索引;
  • 而select * from table_1 where c = ‘女’ ;则不会走索引;
  • 这是由于如果mysql的优化器发现使用索引比全部扫描更慢时,就不会走索引;