【问题标题】:Why does limit make this query faster为什么限制使这个查询更快
【发布时间】:2012-06-11 13:35:24
【问题描述】:

我在这里问的另一个问题引发了另一个问题。 我有这个查询

SELECT `Qty`, `Invt`, `ClassNr`, `SubPartCode`, `Description`, `DesignCode`, `Measure`, `Remark`, `PartMnem`
FROM (`loodvrij_receptuur` lr)
JOIN `loodvrij_artikel` la ON `la`.`PartCode` = `lr`.`SubPartCode`
WHERE `lr`.`PartCode` =  'M2430A'
ORDER BY `SubPartCode`, `Qty` desc

我遇到的问题是它在 phpmyadmin 中的执行速度比 CodeIgniter 快。我发现它与 phpmyadmin 自动添加 LIMIT 30

有关

但我想知道的是,查询只产生 27 个结果。 LIMIT 30 如何使查询更快?我可以理解使用LIMIT 30 可以使返回30 个或更多结果的查询更快,但是当您添加LIMIT 30 时,结果少于30 个的查询如何变得更快?

【问题讨论】:

    标签: optimization limit


    【解决方案1】:

    我认为您假设限制 30 仅在查询结束时起作用。如果我让你查看电话簿中所有姓氏以字母 T 开头并住在纽约的人,你必须拿出 50,000 个名字,然后看看哪些人在纽约。如果我告诉你我只需要 30 个,你就不必拿出 50,000 个名字,你可以看看纽约的人,然后选择前 30 个名字以 T 开头的人。

    SQL 查询通常会以最有效的方式得到解决,因此通过添加 LIMIT 30,引擎盖下的内容将发生变化,从而使您的查询执行得更快。

    【讨论】:

    • 好的,我明白你的意思,但如果我看看我的查询并举个例子。假设您有两个电话簿,并且必须查找所有姓氏以 T 开头的人,并且它们都在两个电话簿中。你不能在 30 岁时停在两本电话簿中的一本……
    • 确实如此,但是您在 PartCode -> SubPartCode 上有外键关系,因此两个搜索并不完全分开
    • 好吧,我同意,通常他们会有外键关系,但在这个数据库中他们没有,任何地方都没有外键。 (我知道不好,但我不做数据库)
    • 在上面的示例中,SQL 可能会查看每个 loodvrij_receptuur 条目并查看是否有 loodvrij_artikel 来执行连接。连接完成后,它将检查 PartCode 是否为M2430A。所以它必须加入每一行,然后检查哪些与 PartCode 匹配。如果您添加限制 30,则不再需要这样做。它可以加入表并开始查看它们,直到它有 30 个匹配项,然后它会停止。
    • 如果没有外键关系,那么会慢很多。如果可能的话,我建议添加一个:)
    【解决方案2】:

    问题不是查询返回多少结果,而是查询必须查看多少项。使用 LIMIT 30,您要求的是在获得前 30 个结果后停止运行。

    如果你不限制结果,sql 仍然会搜索直到它到达基数的末尾。因此,即使您得到的结果少于 30 个,也必须更加努力。

    我不知道我是否说清楚了,对不起我的英语不好。

    【讨论】:

    • 好吧,我知道它会在 30 个结果后停止,但是当你的结果少于 30 个时,我认为它不会停止,直到它完成所有结果......为什么会停止在某个时刻?由于它还没有达到 30 个结果标记...
    • 好的,抱歉,我没听懂。这确实很奇怪。你在说多少胖子?
    • 查询 LIMIT 30 是 0.1 秒,查询没有是 5 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2011-05-17
    • 2011-10-05
    相关资源
    最近更新 更多