MySQL 预处理器优化

MySQL preprocessor optimization

有人知道 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# 应用程序中启动它们。

谢谢。

评论太长了。

您指的步骤不是 "pre-processing",而是 "compiling and optimizing"。而且,是的,MySQL 确实进行了各种优化,如 here 所述。

但是,您的问题的含义是单个相等比较 = 将比两个不等式快得多。通常情况并非如此。更大的问题是索引是否在 statustype 上可用。索引的使用将是影响性能的主要因素——多个不等式可能会阻止 MySQL 找到最佳索引。

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

这取决于您拥有的索引。 INDEX(status), INDEX(type) 没用。 INDEX(status, type)(或相反的顺序)可能工作得很好。

这取决于您使用的是什么版本。较新的版本使用 "Index Condition Pushdown",在这种情况下可能更智能。

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

EXPLAIN FORMAT=JSON SELECT ...(5.6 或更高版本)将为您提供一些线索。

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

(在任何版本中)会给你更强的线索。如果 Handler_read_next 的值大约等于返回的行数,那么它是 运行 尽可能高效。

另一个可能的问题...@变量并不总是像文字一样工作,所以也用文字值进行测试。