MySQL中的MAX_SEEKS_FOR_KEY系统变量在选择是使用索引扫描还是全表扫描时,控制与优化器决策过程相关的阈值。设置max_seeks_for_key过高会带来几种风险,这些风险可能会影响MySQL数据库中查询的性能和效率。
MAX_SEEKS_FOR_KEY代表假定的最大键数量,请在基于索引键查找一行时期望的优化器期望。默认情况下,此值极高(在64位系统上,通常设置为18,446,744,073,709,551,615)。这意味着优化器不会限制自己的索引昂贵的钥匙查找。
当MAX_SEEKS_FOR_KEY设置很高时,优化器倾向于使用表扫描而不是索引扫描,尤其是在索引的基数(索引中唯一值的估计数量)相对较低的情况下。这可能导致几个不良后果:
1。次优查询计划:
高MAX_SEEKS_FOR_KEY的最重要风险是查询优化器可以选择完整的表扫描而不是更有效的索引扫描。完整的表扫描顺序读取表中的每一行,如果表格较大,并且查询只需要一小部分行,则可能会导致较高的I/O成本。与使用适当的索引扫描相比,这会导致查询执行时间较慢。
2。增加资源使用率和延迟:
完整的表扫描通常会消耗更多的CPU和磁盘I/O资源,因为必须检查表中的每一行。这可能有助于总体系统负载,增加查询的延迟,并减少MySQL Server的吞吐量,尤其是在高用户并发或非常大的数据集中。
3。大桌子上的表现不佳:
由于完整的扫描需要阅读整个表格,因此将MAX_SEEKS_FOR_KEY设置为有许多行的大表格会产生负面影响。理想情况下应利用索引的查询快速过滤行,而是产生冗长的扫描持续时间,从而降低应用程序响应能力。
4。跨查询的行为不一致:
因为max_seeks_for_key在全球适用,因此增加其值会影响服务器上的所有查询。尽管某些查询可能会受益于全面扫描,但许多针对索引优化的其他查询可能会表现更糟。这会带来不可预测的性能和不一致的查询性能,需要仔细且持续的特定查询实验和调整。
5。未能有效利用指数的基数:
索引基数(索引中不同值的估计)是MySQL优化器决策的关键。如果MAX_SEEKS_FOR_KEY设置了太高,则优化器会假设它们可能需要比实际较高的钥匙搜索来惩罚索引扫描,即使应该在逻辑上使用高心电图索引。因此,基于索引的优化不足或忽略。
6。误导优化器统计:
优化器取决于统计数据,例如索引基数和与行查找相关的成本。当max_seeks_for_key通过过于允许而掩盖实际成本时,它可能会导致优化器误判访问路径的成本,从而影响优化器的整体成本模型准确性。
7。难以解决性能问题:
由于max_seeks_for_key可以以复杂的方式与索引统计信息和查询计划进行交互,因此设置过高可以使诊断缓慢的查询更具挑战性。它可能导致调整索引或重写查询不会产生预期改进的情况,因为优化器中的基本成本假设仍然偏斜。
风险总结:设置MAX_SEEKS_FOR_KEY太高会导致MySQL优化器偏爱全表扫描而不是索引扫描,从而导致执行时间较慢,CPU和I/O负载增加,效率低下的索引,对索引的效率低下,对大台上的效果降低了,大台上的性能,不一致的Query Chemance行为,不一致的成本成本估计,通过优化的成本估计,优化的功能和绩效效果和挑战,并调整了调查和挑战,并调整了调整和挑战,并调整了调整和挑战。
这些风险突出显示了为什么许多DBA选择将MAX_SEEKS_FOR_KEY降低到更中等的水平(例如1000或类似)。当索引基数超过该阈值时,降低该值鼓励优化器更喜欢索引使用而不是全面扫描,通常会提高查询速度并减少典型工作负载的资源消耗。
总而言之,尽管Max_Seeks_for_key的高度很高,因为它不限制优化器,但实际上,由于过早的全桌扫描而导致的较差的查询性能,浪费资源和延迟较高,尤其是在应该有效地索引的大型数据集上。