MySQL InnoDB有两种索引:
- 聚簇索引
- 叶子节点存放的是主键ID+行数据
- 普通索引
- 叶子节点存放的是主键ID
什么是回表查询:
t(id PK, name KEY, sex, flag);
什么是索引覆盖?
- 索引覆盖:通过普通索引查询的时候,不需要回表查询,直接可以获取到对应的数据
还是上面的例子,如果查询为:
select name,id from t where name = “lisi”;
如果需要查询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’;