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 所述。
但是,您的问题的含义是单个相等比较 =
将比两个不等式快得多。通常情况并非如此。更大的问题是索引是否在 status
和 type
上可用。索引的使用将是影响性能的主要因素——多个不等式可能会阻止 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
的值大约等于返回的行数,那么它是 运行 尽可能高效。
另一个可能的问题...@变量并不总是像文字一样工作,所以也用文字值进行测试。
有人知道 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 所述。
但是,您的问题的含义是单个相等比较 =
将比两个不等式快得多。通常情况并非如此。更大的问题是索引是否在 status
和 type
上可用。索引的使用将是影响性能的主要因素——多个不等式可能会阻止 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
的值大约等于返回的行数,那么它是 运行 尽可能高效。
另一个可能的问题...@变量并不总是像文字一样工作,所以也用文字值进行测试。