在启动查询之前,有人知道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#应用程序中启动它们之前,帮助它编写适当的优化语句。
谢谢。
发布于 2015-11-27 17:02:41
这太长了,不能发表评论。
您所指的步骤不是“预处理”,而是“编译和优化”。而且,是的,MySQL确实进行了各种优化,这里描述了这一点。
但是,问题的含义是,一个等式比较=比两个不等式要快得多。一般情况并非如此。更大的问题是,在status和type上是否有索引可用。索引的使用将是性能的主要因素--多个不等式可能会阻止MySQL找到最佳的索引。
我的建议是为查询创建正确的索引。然后编写查询,以确保它们利用了索引。
发布于 2015-11-27 21:19:19
这取决于你的索引。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的值大约等于返回的行数,那么它将尽可能高效地运行。
另一个可能的皱纹..。@变量并不总是像文字一样工作,所以也使用文字值进行测试。
https://stackoverflow.com/questions/33961870
复制相似问题