MySQL索引详解

发布时间 2024-01-05 14:38:17作者: 冷松

1、联合索引

使用表中的多个字段创建索引,就是 联合索引,也叫 组合索引 或 复合索引

以 score 和 name 两个字段建立联合索引:

ALTER TABLE `cus_order` ADD INDEX id_score_name(score, name);
 

2、最左前缀匹配原则

最左前缀匹配原则指的是,在使用联合索引时,MySQL 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与联合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至联合索引中全部字段匹配完成,或者在执行过程中遇到范围查询(如 >**、<)才会停止匹配。对于 **>=**、<=BETWEENlike** 前缀匹配的范围查询,并不会停止匹配。所以,我们在使用联合索引时,可以将区分度高的字段放在最左边,这也可以过滤更多数据。

 

 

3、被频繁更新的字段应该慎重建立索引

虽然索引能带来查询上的效率,但是维护索引的成本也是不小的。 如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。

 

限制每张表上的索引数量

索引并不是越多越好,建议单张表索引不超过 5 个!索引可以提高效率同样可以降低效率。

索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。

 

尽可能的考虑建立联合索引而不是单列索引

因为索引是需要占用磁盘空间的,可以简单理解为每个索引都对应着一颗 B+树。

 

字符串类型的字段使用前缀索引代替普通索引

前缀索引仅限于字符串类型,较普通索引会占用更小的空间,所以可以考虑使用前缀索引带替普通索引。

 

避免索引失效

索引失效也是慢查询的主要原因之一,常见的导致索引失效的情况有下面这些:

    • 使用 SELECT * 进行查询;
    • 创建了组合索引,但查询条件未遵守最左匹配原则;
    • 在索引列上进行计算、函数、类型转换等操作;
    • 以 % 开头的 LIKE 查询比如 like '%abc';
    • 查询条件中使用 or,且 or 的前后条件中有一个列没有索引,涉及的索引都不会被使用到;
    • 发生隐式转换;

知道如何分析语句是否走索引查询

  • 我们可以使用 EXPLAIN 命令来分析 SQL 的 执行计划 ,这样就知道语句是否命中索引了
 
MySQL隐式转换造成索引失效 :https://snailclimb.gitee.io/javaguide/#/./docs/database/mysql/index-invalidation-caused-by-implicit-conversion