MySQL查询性能问题 - INNER JOIN,ORDER BY,DESC

时间:2011-08-24 21:23:12

标签: mysql join sql-order-by inner-join

我有这个问题:

                SELECT 
                t.type_id, t.product_id, u.account_id, t.name, u.username

                FROM
                types AS t

                INNER JOIN
                ( SELECT user_id, username, account_id 
                  FROM users WHERE account_id=$account_id ) AS u

                ON 

                t.user_id = u.user_id 

                ORDER BY 
                t.type_id DESC

第一个问题:

目前这样做大约需要30秒,类型表中只有18k记录。

目前唯一的索引只是一个只有id的主索引。

长时间是否会因缺乏更多索引而导致?或者更多的是这个查询的结构?

第二个问题:

如何添加LIMIT,以便我只获得100条具有最高type_id的记录?

2 个答案:

答案 0 :(得分:1)

如果不对用户表进行子选择,我认为如果不改变结果,它会快100倍。在这种情况下根本不需要它。

您只需添加LIMIT 100即可获得前100个结果(如果没有100个结果,则更少)。

SELECT SQL_CALC_FOUND_ROWS /* Calculate the total number of rows, without the LIMIT */
  t.type_id, t.product_id, u.account_id, t.name, u.username
FROM
  types t
  INNER JOIN users u ON u.user_id = t.user_id
WHERE
  u.account_id = $account_id
ORDER BY
  t.type_id DESC
LIMIT 1

然后,执行第二个查询以获取计算的总行数。

SELECT FOUND_ROWS()

答案 1 :(得分:0)

MySQL上的子选择将减慢您的查询速度。我假设这个

SELECT user_id, username, account_id 
FROM users WHERE account_id=$account_id

根本不会返回多行。如果是这种情况,那么单独的子选择将无法解释您所看到的延迟。

尝试在类型表中的user_id上抛出索引。没有它,你正在对该子选择返回的每条记录进行18k记录的全表扫描。

内部加入用户表并添加该索引,我打赌你看到速度大幅提升。