在 mysql 查询中使用 force index 子句可能有啥缺点? [关闭]

Posted

技术标签:

【中文标题】在 mysql 查询中使用 force index 子句可能有啥缺点? [关闭]【英文标题】:What could be the possible drawbacks of using force index clause in mysql query? [closed]在 mysql 查询中使用 force index 子句可能有什么缺点? [关闭] 【发布时间】:2020-12-30 14:19:38 【问题描述】:

示例 - SELECT * FROM table_name FORCE INDEX (index_list) WHERE condition;

在不使用强制索引的情况下,mysql 的查询优化器会决定可以在给定查询中使用的最佳索引候选者。但是,如果它发现它仍然必须扫描主要百分比的行,那么它会跳过索引并继续进行全扫描。因此,它可能使用也可能不使用任何索引。

所以,假设查询优化器有一个更好的索引候选,它可以使用(甚至没有任何索引)来更快地计算查询。但是通过强制索引,它可能会减慢查询速度。

【问题讨论】:

有和没有索引提示的查询在性能方面如何比较? FORCE INDEX 今天可能会有所帮助,但明天会在数据分布发生变化时造成伤害。 【参考方案1】:

为了确保我不会犯这个错误 [...] 我应该注意哪些方面?

为什么不让查询规划器来做这些艰苦的工作呢?

数据库供应商在开发高效且经过微调的软件方面投入了大量精力。在绝大多数情况下,查询计划器在为查询构建理想执行计划方面做出了正确的决定。执行完整扫描而不是昂贵的索引查找通常是这些cost-based optimizations 之一。

根据我的经验,在极少数情况下确实需要索引提示。此外,索引提示会以某种方式产生技术债务,因为当数据或结构将来发生变化时,它们可能会对查询的性能产生负面影响。那应该是你最后的手段,而不是第一件事。

注意:不要忽视的一件事是优化器需要accurate information 才能做出正确的决定。确保在您的桌子上定期运行ANALYZE TABLE

【讨论】:

以上是关于在 mysql 查询中使用 force index 子句可能有啥缺点? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

mysql force index 简单使用

mysql force index() 强制索引的使用

MySQL 中的 FORCE INDEX - 我把它放在哪里?

Mysql的强制索引(Force Index)都为我们做了哪些优化?

MySQL force Index 强制索引概述

为什么我建议在复杂但是性能关键的表上所有查询都加上 force index