1

我有两张表,其中包含用户的日常活动。我有两个加入这些表并从该表中选择前十名。

表 1:构建日志

+----------------+------------------------+------+-----+---------+----------------+
| Field          | Type                   | Null | Key | Default | Extra          |
+----------------+------------------------+------+-----+---------+----------------+
| NAME           | varchar(50)            | YES  |     | NULL    |                |
| ID             | int(11)                | NO   | PRI | NULL    | auto_increment |
| DATE_AND_TIME  | datetime               | YES  |     | NULL    |                |
| COMMENT        | mediumtext             | YES  |     | NULL    |                |
+----------------+------------------------+------+-----+---------+----------------+

行数:276186

表 2:报告

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| r_id          | int(10)      | NO   | PRI | NULL    | auto_increment |
| id            | int(15)      | YES  | UNI | NULL    |                |
| label         | varchar(200) | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+

行数:134058

如果我只使用这两个表的连接查询,使用id它会很快。

查询 1

select  buildlog.id,reports.label from buildlog join reports on reports.id = buildlog.id limit 10\G

查询时间:10 行集合(0.01 秒)

如果我添加 order by 以获取最新的 10 个构建 ID,则标记执行需要 1 到 2 分钟。

查询 2

select  buildlog.id,reports.label from buildlog join reports on reports.id = buildlog.id order by buildlog.id desc limit 10\G

查询时间:10 rows in set (0.98 sec)

按列排序是主键buildlog.id。那么,它已经被索引了,为什么执行这个查询需要更多时间?. 谁能建议我如何优化它?

4

1 回答 1

0
SELECT  * FROM (
    SELECT
      buildlog.id,
      reports.label
    FROM
      buildlog
    JOIN
      reports
    ON
      reports.id = buildlog.id
) AS myval_new
ORDER BY id DESC limit 10

速度变慢是因为它可能选择在进行连接之前进行排序。在外部查询中执行 order by 会强制它仅对所选项目进行排序。

于 2012-10-30T13:44:10.477 回答