MYSQL:通过order by子句提高连接的查询性能

时间:2012-10-30 13:00:48

标签: mysql mysql-workbench

我有两个表,其中包含用户的日常活动。我有两个连接这些表并从此表中选择前十个ID。

表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。那么,它已被索引为什么需要更多时间来执行此查询? 。任何人都可以建议我如何优化它?

1 个答案:

答案 0 :(得分: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

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