假设其中有一个包含1亿条记录的表:
+---------+---------+------+
| user_id | post_id | date |
+---------+---------+------+
我们希望拥有最新的30条记录,其中#1的用户已发布。
SELECT * FROM users_posts WHERE user_id = 1 ORDER BY date DESC LIMIT 30
MySQL如何在表中搜索?它是否搜索所有匹配(完全扫描)找到所有匹配,然后按日期排序?
如果是(完全扫描),我们如何编辑此查询以限制它搜索最新记录,直到找到30个匹配。 (提高阅读速度,有更好的表现)
先谢谢。
答案 0 :(得分:4)
如果您希望此查询获得最佳效果:
SELECT *
FROM users_posts
WHERE user_id = 1
ORDER BY date DESC;
然后你需要users_posts(user_id, date)
上的索引。这将允许SQL引擎仅使用索引来定义正在使用的行集。首先,它将使用user_id
来满足where
子句。然后它将date
部分用于order by
。它仍然需要查找原始数据页中的记录,以获取select
所需的所有列。
如果要将此限制为30行,请添加limit 30
:
SELECT *
FROM users_posts
WHERE user_id = 1
ORDER BY date DESC
LIMIT 30;
使用上述索引,这将提高性能。如果没有索引,引擎将必须扫描所有数据,对匹配where
子句的数据进行排序,然后应用limit
- 换句话说,它不会是一个绩效改善。