[英]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#应用程序中启动它之前我应该帮助它编写适当的优化语句。
谢谢。
这取决于你拥有的索引。 INDEX(status), INDEX(type)
很没用。 INDEX(status, type)
(或相反的顺序) 可能效果很好。
这取决于您使用的是什么版本。 较新版本使用“索引条件下推”,在这种情况下可能更智能。
旧版本可能会看到不平等并决定它是一个“范围”。 然后它会说“2个范围,所以我不能使用INDEX(status, type)
的两个部分INDEX(status, type)
”。
EXPLAIN FORMAT=JSON SELECT ...
(5.6或更新版本)将为您提供一些线索。
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
(在任何版本中)将为您提供更强的线索。 如果Handler_read_next
的值大约等于返回的行数,则它尽可能高效地运行。
另一种可能的皱纹......变量并不总是像文字一样工作,所以也要用文字值进行测试。
这个评论太长了。
您所指的步骤不是“预处理”,而是“编译和优化”。 而且,是的,MySQL的做各种优化,描述在这里 。
然而,你的问题的含义是,单个相等比较=
将比两个不等式快得多。 通常情况并非如此。 更大的问题是索引是否可用于status
和type
。 索引的使用将是性能的主要因素 - 多个不等式可能会阻止MySQL找到最佳索引。
我的建议是为您的查询创建正确的索引。 然后编写查询以确保它们利用索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.