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 的查询优化器会帮你优化成索引可以识别的形式.

1.联合索引

使用情况:
对于查询语句"select e.* from e where e.e1=1 and e.e3=2"涉及到两列, 这个时候我们一般采用一个联合索引(e1, e3); 而不用两个单列索引, 这是因为一条查询语句往往应为mysql优化器的关系只用了一个索引, 就算你有两个索引, 他也只会用到一个(Mysql的最左匹配原则) ; 在只用到一个的基础上, 联合索引是会比单列索引要快的;

命中规则:
示例: create table e(e1 int, e2 varchat(9), e3 int, primary key(e1, e3));
这样就建立了一个联合索引: e1, e3

  • 使用联合索引的全部索引键, 可触发索引的使用.
    如: select e.* from e where e.e1=1 and e.e3=2
  • 查询条件中包含索引的前缀部分, 也就是 e1, 可以触发索引的使用
    如: select e.* from e where e.e1=1
  • 使用部分索引键, 但不包含索引的前缀部分
    如: select e.* from e where e.e3=1
  • 使用联合索引的全部索引键, 但不是AND操作, 不可以触发索引的使用
    如: select e.* from e where e.e3=2 or e.e1=1

2.普通索引

就是最基本的索引, 查他就能命中

3. 唯一索引

和普通索引类似, 不同的就是索引的列必须是唯一存在的, 可以为空

4. 全文索引

只支持老版本的MySql 也就是引擎为MyISAM的数据表.

猜你喜欢

转载自blog.csdn.net/qq_41637554/article/details/86629919