mysql建立索引的原则

  1. 最左前缀匹配原则,及其重要的原则,mysql会一直向右匹配遇到范围查询(>,<,between,like)就会停止匹配,比如a=1 AND b = 2 AND c > 3 AND d = 4 如果建立(a,b,c,d)的索引,d是使用不到索引的。如果建立(a,b,d,c)则都是可以用到索引的,其中a,b,d之间的顺序可以更换。
  2. =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器可以帮你优化成索引可以识别的形式。
  3. 尽量选用区分度高的列作为索引,区分度的公式select(distinct(count(col)) / count(*)),表示字段不重复的比例,比例越大我们扫描的记录数就越少。
  4. 索引列不能参与计算,需要保持列”干净”,比如form_unixtime(create_time) = ‘2019-04-25’ ,就不能使用到索引,原因很简单,b+数中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大,所以语句应该写成create_time = unix_timestamp(‘2019-04-25’)。
  5. 尽量的扩建索引,而不要创建索引。比如表中已经有a的索引,现在要加(a,b)的索引,只需要修改之前的索引即可。

    慢查询回顾

    根据最左匹配原则,最开始的sql语句的索引应该是status、operator_id、type、operate_time的联合索引;其中status、operator_id、type的顺序可以颠倒,所以我才会说,把这个表的所有相关查询都找到,会综合分析; 比如还有如下查询:
  1. select * from task where status = 0 and type = 12 limit 10;
select count(*) from task where status = 0 ;

那么索引建立成(status,type,operator_id,operate_time)就是非常正确的,因为可以覆盖到所有情况。这个就是利用了索引的最左匹配的原则。