MySQL预处理器优化

本文关键字:优化 处理器 预处理 MySQL | 更新日期: 2023-09-27 18:24:51

有人知道MySQL在启动查询之前是否涉及任何预处理器优化吗?

考虑以下查询:

string query = "SELECT giveaway_id FROM giveaways WHERE status >= @minStatus AND status <= @maxStatus AND type >= @minType AND type <= @maxType";

如果@minStatus@maxStatus相等,以及@minType@maxType相等,我们可以用更优化的形式写上面的查询:

string query = "SELECT giveaway_id FROM giveaways WHERE status = @minStatus AND type = @minType";

我想知道MySQL是否足够聪明,可以超越自己,或者在我的C#应用程序中启动它们之前,我应该帮助它编写适当的优化语句。

谢谢。

MySQL预处理器优化

这取决于您拥有的索引。INDEX(status), INDEX(type)是非常无用的。INDEX(status, type)(或相反顺序)可能工作良好。

这取决于您使用的版本。较新的版本使用"索引条件下推",在这种情况下可能更聪明。

旧版本可能会看到不平等,并决定这是一个"范围"。然后它会说"2个范围,所以我不能同时使用INDEX(status, type)的两个部分"。

EXPLAIN FORMAT=JSON SELECT ...(5.6或更新版本)将为您提供一些正在发生的事情的线索。

FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';

(在任何版本中)都会给你一个更有力的线索。如果Handler_read_next的值大约等于返回的行数,则它正在尽可能高效地运行。

另一个可能的皱纹…@变量并不总是像文字一样工作,所以也要使用文字值进行测试。

这对于注释来说太长了。

您所指的步骤不是"预处理",而是"编译和优化"。是的,MySQL确实进行了各种优化,如这里所述。

然而,你的问题意味着,单个等式比较=将比两个不等式快得多。通常情况并非如此。更大的问题是statustype上是否有索引可用。索引的使用将是性能的主要因素,而多重不平等可能会阻碍MySQL找到最佳索引。

我的建议是为您的查询创建正确的索引。然后编写查询以确保它们利用索引。