• MySql索引优化


    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使用索引的严格要求:

    1. 索引的顺序与order by;
    2. 索引中所有的列的方向与order by字句完全一致;
    3. 当多表连接查询时order by中的字段必须在关联表的第一张;
    4. 如果有使用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使用指定索引,视情况而定。

  • 相关阅读:
    hashmap的一些基础原理
    关于uuid
    读锁跟写锁的区别
    栈为什么效率比堆高
    MySQL行级锁、表级锁、页级锁详细介绍
    MYSQL MyISAM与InnoDB对比
    MYSQL锁表问题解决
    mysql查询锁表语句
    三种排序方法
    正则表达式
  • 原文地址:https://www.cnblogs.com/yyml181231/p/12693693.html
Copyright © 2020-2023  润新知