繁体   English   中英

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#应用​​程序中启动它之前我应该​​帮助它编写适当的优化语句。

谢谢。

这取决于你拥有的索引。 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的做各种优化,描述在这里

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM