我正在尝试为特定实体创建状态/消息更新页面。用户可以订阅任意数量的实体,在此页面上您将获得最新信息。我当前的查询需要一段时间才能运行(1.3+ 秒,在一个有 200K 行的测试表中),它只抓取了 50 左右行
架构是:
实体:
entity_id, message, timestamp
用户
user_id
订阅
user_id, entity_id
查询是:
SELECT entity.*
FROM entity
INNER JOIN subscription ON subscription.entity_id = entity.entity_id
WHERE subscription.user_id = 1
ORDER BY entity.timetamp DESC
LIMIT 50
数据库方面的问题似乎是这样的:
Copying to tmp table 0.033285
converting HEAP to MyISAM 0.031850
Copying to tmp table on disk 1.177973
Sorting result 0.064075
在订阅表上,我得到以下解释信息:使用索引;使用临时的;使用文件排序
我正在使用 InnoDB 表,并且在 entity_id、user_id 和时间戳列上有索引
更新:看来 order by 可能是有贡献的,或者是问题所在。我在时间戳列上有一个索引,除此之外,我还能做些什么来更快地获取最新消息?
更新:当我删除 order by 子句时,查询运行得很快。0.0006 秒 vs 1.3。所以我尝试先通过子查询获取数据,然后运行 order by,但这并没有做任何事情。
使用的查询是:
SELECT tbl.* FROM (
SELECT entity.*
FROM entity
INNER JOIN subscription ON subscription.entity_id = entity.entity_id
WHERE subscription.user_id = 1
) as tbl
ORDER BY tbl.timetamp DESC