MySQL预处理器优化
本文关键字:优化 处理器 预处理 MySQL | 更新日期: 2023-09-27 18:24:51
有人知道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)
的两个部分"。
EXPLAIN FORMAT=JSON SELECT ...
(5.6或更新版本)将为您提供一些正在发生的事情的线索。
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
(在任何版本中)都会给你一个更有力的线索。如果Handler_read_next
的值大约等于返回的行数,则它正在尽可能高效地运行。
另一个可能的皱纹…@变量并不总是像文字一样工作,所以也要使用文字值进行测试。
这对于注释来说太长了。
您所指的步骤不是"预处理",而是"编译和优化"。是的,MySQL确实进行了各种优化,如这里所述。
然而,你的问题意味着,单个等式比较=
将比两个不等式快得多。通常情况并非如此。更大的问题是status
和type
上是否有索引可用。索引的使用将是性能的主要因素,而多重不平等可能会阻碍MySQL找到最佳索引。
我的建议是为您的查询创建正确的索引。然后编写查询以确保它们利用索引。