MySQL问题:列上的索引!

时间:2009-10-20 16:00:16

标签: sql mysql indexing

我有一个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列会加快速度?

谢谢大家! :)

6 个答案:

答案 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是外键,那么它不需要创建索引。它有内置索引。