1、in操作能避免就避免,实在避免不了,最好将in后边的集合元素数量,控制在1000以内;
2、范围查询走索引;
3、模糊查询只有左前缀使用索引;
4、反向条件不走索引!=,<>、not in、is not null;
5、对条件计算(使用函数或者表达式)不走索引;
6、查询时必须使用正确的数据类型;
7、or只有两边都有索引才走索引,否则不走索引;
8、用union少用or;
9、能用union all就不用union;
10、对于复合索引,如果单独使用右边的索引字段作为条件时不走索引的。即复合索引如果不满足最左原则leftmost,不会走复合索引;
11、如果是覆盖索引的情况,即使不满足走索引的条件,此时也会使用索引;
12、order by使用索引的严格要求:
- 索引的顺序与order by;
- 索引中所有的列的方向与order by字句完全一致;
- 当多表连接查询时order by中的字段必须在关联表的第一张;
- 如果有使用order by的场景,请注意利用索引的有序性。order by最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影响查询性能。如果索引中范围查找,那么索引的有序性无法利用。order by如果根据多个值进行排序,那么排序方式必须保持一致,否则不走索引;
13、如果group by指定的列没有走索引,并且分组的数据与顺序无关,那么就要使用order by NULL来关闭group by的排序功能;
14、分页limit
分页查询应该尽可能减少扫描:
第一种思路:在索引上完成排序分页的操作,最后根据主键关联回原表查询原来所需要的其他列。这种思路是使用覆盖索引尽快定位出需要的记录的id,覆盖索引效率高些;
第二种思路:limit m, n转换为n,主要用于排序字段不重复唯一的列;
多表连接查询连接条件(也就是外键必须创建索引,否则大数据查询直接卡死);当通过索引获取到的数据库记录>数据库总记录的三分之一时, SQL将有可能直接全表扫描,索引就失去了应有的作用。
where条件将能过滤掉多的条件写在前面,过滤掉少部分的数据写在后面,这样先排除一大部分不满足条件的数据,然后剩下一小部分数据;
数据类型不匹配是不会走索引的;
15、
select * from a where id in (select a_id from b)
当a表中的数据远大于b表中的数据量时使用in, 否则使用exists.
16、当查询不走索引时可以通过force index强制mysql使用指定索引,视情况而定。