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使用索引的严格要求:
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使用指定索引,视情况而定。
原文:https://www.cnblogs.com/yyml181231/p/12693693.html