在连接两个大表

时间:2017-04-25 05:35:53

标签: mysql

我们的系统有两个表: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

我非常感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:1)

i)你不能删除订单,因为你要使用分页,这很好

ii)删除不同的

iii)删除“*”并仅使用选定的列名

iii)希望user_post_like_countsuser_post_iduser_postsid都是CI。

iv)因为total_count将始终按desc排序,使其成为NCI并按索引级别本身的desc排序

v)如果使用deleted_at IS NULL获得几乎所有记录(80%),则无需在已删除的表上创建索引。

vi)由于post表包含大量记录并且是最重要的表。 不要将删除的记录保存在同一个table.create单独的历史表中。 这是一个重要因素

vii)所以我认为在created_at上用覆盖索引创建NCI。包括post表的那些列。