我有这个问题:
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的记录?
答案 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记录的全表扫描。
内部加入用户表并添加该索引,我打赌你看到速度大幅提升。