我有一个MySQL问题
我在一对多的关系中有两个表(帖子和作者)(因为每个帖子都是由作者写的,作者可以写多个帖子。)
以下是表格:
Authors: id:BIGINT, name:VARCHAR(255) Posts: id:BIGINT, author_id:BIGINT, body:TEXT
我有700,000个帖子和60,000个作者。
如果我选择一位作者(例如author_id = 45)并且我想要一封由他撰写的随机文章,我写道:
SELECT * FROM Posts WHERE author_id = 45 ORDER BY RAND() LIMIT 1;
我知道这是对的,但是当我在线同时有4,000人时,大约需要6秒钟。
也许在Posts表中索引author_id列会加快速度?
谢谢大家! :)
答案 0 :(得分:5)
索引应该反映最流行的WHERE子句场景。
在这种特殊情况下,创建索引,然后将查询更改为:
SELECT id,author_id,body
FROM Posts
WHERE author_id = 45
ORDER BY RAND()
LIMIT 1;
这将阻止在搜索之前进行模式查找,从而提高性能。
SELECT *对于高频查询来说是邪恶的。
答案 1 :(得分:2)
是的,你肯定应该添加索引。
CREATE INDEX Post_author_id ON Posts(author_id);
作为进一步的证据,请运行
EXPLAIN SELECT * FROM Posts WHERE author_id = 45 ORDER BY RAND() LIMIT 1;
答案 2 :(得分:0)
如果你还没有和author_id索引,肯定会把它放在上面。另外我不确定ORDER BY RAND()不对性能缺陷负责。尝试添加索引,它应该已经大大改善。
答案 3 :(得分:0)
特别是在您读取数据的情况比更新数据要多得多的情况下,在设置索引时要慷慨。你应该在where子句中拥有的任何东西都应该编入索引。
答案 4 :(得分:0)
Author_id上的[可能聚集]索引肯定会有所帮助。
ORDER BY RAND()部分似乎还有一个额外的风险因素。本质上,此子句使SQL动态地为每一行(对于给定的Author_id)分配一个随机数,并对它们进行排序。这可能成为一个瓶颈,因为一些多产的作者开始有成百上千的帖子。
答案 5 :(得分:0)
如果author_id是外键,那么它不需要创建索引。它有内置索引。