使用力指数

Jon*_*han 8 mysql index optimization

我最近参加了 Facebook MySQL 工程师的演讲,他在那里提到使用FORCE INDEX减少 I/O。

这与 MySQL 查询优化器有关,无需访问数据字典并进行计算。

  • 谁能解释一下这是如何工作的(最好有参考资料)?
  • 这是一个很好的优化实践吗?

Rol*_*DBA 10

关于FORCE INDEX 的一个很好的参考来源是MySQL Database Design and Tuning一书。

MySQL 数据库设计和调优

在第 120 页第 4 段,它说:

FORCE INDEX 适用于何处?FORCE INDEX(在 4.0.9 版本中首次启用)与 USE INDEX 非常相似;这两个选项的主要区别在于 FORCE INDEX 要求 MySQL 使用索引(如果可能)代替更昂贵的表扫描,而 USE INDEX 仍然允许优化器选择表扫描。

同页说 MySQL 不会警告索引不相关,并在 USE INDEX 的情况下切换到表扫描。

因此,FORCE INDEX 可以在使用索引之前将 MySQL 查询优化器排除在外。任何正确使用 FORCE INDEX 的查询都会减少 I/O。为什么我说得好?

想想看。如果您选择浏览的索引是覆盖索引,并且您只需要覆盖索引中列出的列,则无需联系表以获取数据。所有 I/O 仅限于索引页。在最坏的情况下,通过执行索引扫描来检索所有请求的数据。如果需要对请求的数据进行排序,从而绕过任何请求的排序,那确实是一件好事。

在“交战规则”方面,FORCE INDEX 只应在以下情况下使用

  • 参考覆盖索引
  • 索引中的所有列的大小都很小
  • 你有效地调整了 SELECT 查询的缓存行为
    • 对于即席查询,请使用SQL_NO_CACHE
    • 对于经常更新的数据,明智地缓存

如果您试图将方钉放入圆孔中,则不应使用 FORCE INDEX 强制查询使用索引。换句话说,仅遍历索引以按特定顺序访问表数据不会给您带来任何好处。事实上,它会在总线下抛出查询性能,因为没有预先了解您的数据需要如何可用。