我们的系统有两个表:user_posts(post)& user_post_like_counts(喜欢的数量)。 我实现了一个函数来按照计数对帖子(asc / desc)进行排序。
问题是:当数据表大约有2百万条记录时。执行sql需要很长时间( 2分钟)。
SELECT DISTINCT user_posts.*, `user_post_like_counts`.total_count
FROM `user_posts`
LEFT OUTER JOIN `user_post_like_counts` ON `user_post_like_counts`.`user_post_id` = `user_posts`.`id`
WHERE `user_posts`.`deleted_at` IS NULL
AND `user_posts`.`created_at` <= '2017-04-24 01:47:00'
ORDER BY `user_post_like_counts`.total_count DESC
LIMIT 50
OFFSET 0;
如果我删除 命令上述sql只需不到1秒即可执行。
这是对此sql查询的EXPLAIN。
https://i.stack.imgur.com/sBK4j.png
我非常感谢任何帮助。 感谢
答案 0 :(得分:1)
i)你不能删除订单,因为你要使用分页,这很好
ii)删除不同的
iii)删除“*”并仅使用选定的列名
iii)希望user_post_like_counts
。user_post_id
和user_posts
。id
都是CI。
iv)因为total_count将始终按desc排序,使其成为NCI并按索引级别本身的desc排序
v)如果使用deleted_at
IS NULL获得几乎所有记录(80%),则无需在已删除的表上创建索引。
vi)由于post表包含大量记录并且是最重要的表。 不要将删除的记录保存在同一个table.create单独的历史表中。 这是一个重要因素
vii)所以我认为在created_at上用覆盖索引创建NCI。包括post表的那些列。