不走索引的情况:
- 函数或表达式在索引列上使用: 如果查询条件中对索引列使用了函数或者表达式,MySQL 通常无法使用该索引。
- 隐式类型转换: 如果查询条件的数据类型与索引列的数据类型不匹配,并且无法进行隐式类型转换,MySQL 可能无法使用索引。
- 索引列与条件列不匹配: 如果查询条件中的列与索引列不匹配,MySQL 将无法使用该索引。
- 数据量过小: 当表中的数据量非常小(比如少于几十行),MySQL 可能会选择全表扫描而不使用索引,因为全表扫描的成本可能更低。
- 索引失效: 在某些情况下,MySQL 可能由于统计信息过期或其他内部优化策略而决定不使用某些索引。
导致回表的情况:
回表指的是在索引扫描后,还需要进一步访问数据表以获取完整的数据行。以下情况可能导致回表:
- 覆盖索引不足够: 如果索引无法覆盖查询所需的所有列,MySQL 将不得不回表获取未包含在索引中的列数据。
- 查询涉及到的列不在索引中: 如果查询需要的列不在任何索引中,MySQL 必须回表获取这些列的数据。
- 使用了不合适的索引: 有时候,使用了不合适的索引也会导致回表的发生,比如索引覆盖不全面或者使用了过于稀疏的索引。
为了避免不必要的回表操作,应该优化查询语句和索引设计,确保查询能够尽可能使用覆盖索引或者最小化回表次数。