【问题标题】:MySQL preprocessor optimizationMySQL预处理器优化
【发布时间】:2016-03-01 22:05:45
【问题描述】:

有人知道 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# 应用程序中启动它们之前帮助它编写适当的优化语句。

谢谢。

【问题讨论】:

    标签: c# mysql sql optimization preprocessor


    【解决方案1】:

    这取决于您拥有的索引。 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 的值大约等于返回的行数,则它正在尽可能高效地运行。

    另一个可能的问题...@变量并不总是像文字一样工作,所以也要使用文字值进行测试。

    【讨论】:

    • 感谢您提出一个很好的检查方法。
    【解决方案2】:

    评论太长了。

    您所指的步骤不是“预处理”而是“编译和优化”。而且,是的,MySQL 确实进行了各种优化,描述为 here

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

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

    【讨论】:

    • 我知道它不会对性能产生太大影响,因为正确的索引更为重要,我只是想知道是否值得在我的应用程序中“预优化”语句,或者让 MySQL 来做工作不要做同样的事情两次。根据您的链接,我可以忽略这一点,因为 MySQL 自己会这样做,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2010-12-18
    • 2023-01-17
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多