MySQL索引覆盖 回表查询

MySQL InnoDB有两种索引:
  • 聚簇索引
    • 叶子节点存放的是主键ID+行数据
  • 普通索引
    • 叶子节点存放的是主键ID

什么是回表查询:

t(id PK, name KEY, sex, flag);

MySQL索引覆盖 回表查询

MySQL索引覆盖 回表查询

什么是索引覆盖?

  • 索引覆盖:通过普通索引查询的时候,不需要回表查询,直接可以获取到对应的数据
还是上面的例子,如果查询为:

select name,id from t where name = “lisi”;

MySQL索引覆盖 回表查询

如果需要查询SQL是:

select name,id,sex from t where name = “lisi”;

该怎么做可以实现覆盖索引,提高效率?
  • 创建联合索引(name,sex) 可以避免回表查询提高效率
索引的使用跟查询的and的前后顺序没有关系:
  • 创建(name,sex,flag)索引,以下这两个查询都走索引
    • select name,id,sex from t where name = “lisi” and sex = “m”;
    • select name,id,sex from t where sex = “m” and name = “lisi” ;
  • 以下查询不走索引:
    • select name,id,sex from t where sex = “m”;
建了一个索引idx(A, B, C),他说的是要使用A, AB, ABC这样的顺序查询,而使用B, BC, 这样是使用不到索引的.而我理解成了and的前后顺序要跟这一样

查询条件类型不一致,需要强转也不会走索引.

explain select * from t1 where cell=111;
explain select * from t1 where cell=‘111’;