【问题标题】:MySQL command Explain ignore LIMIT?MySQL 命令解释忽略限制?
【发布时间】:2011-10-10 04:04:08
【问题描述】:

我使用 MySQL 服务器版本 5.5.14,现在我正在尝试使用 Explain 命令进行这个简单的 SQL 查询:

EXPLAIN SELECT id, name, thumb FROM `twitter_profiles` LIMIT 10;

它向我展示了这个结果:

+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
|  1 | SIMPLE      | tp    | ALL  | NULL          | NULL | NULL    | NULL | 40823 |       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
1 row in set (0.02 sec)

我的问题是为什么它扫描整个表而不是像我在 LIMIT 子句中指定的那样获取前 10 行?

【问题讨论】:

    标签: mysql limit explain


    【解决方案1】:

    这里有一个关于MySQL EXPLAIN limits and errors的文章的好链接

    在估计行数时不考虑 LIMIT 偶数 如果您有 LIMIT 限制将检查多少行 MySQL 仍会打印完整号码

    【讨论】:

    • @Evgi Aha,但这只是关于估计过程,对吧?面子上,mysql只会占用提到的10行,是真的吗?
    • @Jakub,除非您添加 ORDER BY 子句,这是通常的情况(否则,您的 10 行既不是随机的也不是确定的)。它需要检索所有匹配的行以便对它们进行排序,即使它们最终没有发送到客户端。
    • @Alvaro 是的,看来我必须参考索引列名添加 order by 子句并解释给我我所期望的 = 10 行。那么这是解决这个问题的正确方法吗?
    • 如果添加 ORDER BY 会更改整个执行计划,因此 EXPLAIN 将根据用于排序的索引(如果有)为您提供不同的结果。
    • 啊哈,所以我不用担心这个,因为事实上mysql只会从LIMIT子句扫描10行?这只是解释问题?
    【解决方案2】:

    您需要使用 order by:

    EXPLAIN SELECT id, name, thumb
    FROM twitter_profiles ORDER BY LIMIT 10;
    

    【讨论】:

    • 这甚至不是有效的 SQL。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2016-11-16
    • 2023-03-13
    • 2020-04-03
    • 2020-03-29
    相关资源
    最近更新 更多