MySQL 问题:列索引!

Posted

技术标签:

【中文标题】MySQL 问题:列索引!【英文标题】:MySQL question: Indexes on columns! 【发布时间】:2009-10-20 16:00:15 【问题描述】:

我有一个 mysql 问题

我有两个表(帖子和作者),是一对多的关系(因为每个帖子都是由一个作者写的,一个作者可以写多个帖子)。

所以这里是表格:

作者: id:BIGINT,名称:VARCHAR(255) 帖子: id:BIGINT, author_id:BIGINT, 正文: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 列会加快速度?

谢谢大家! :)

【问题讨论】:

【参考方案1】:

索引应该反映您最流行的 WHERE 子句场景。

在这种特殊情况下,创建索引,然后将查询更改为:

SELECT id,author_id,body 
FROM Posts 
WHERE author_id = 45 
ORDER BY RAND() 
LIMIT 1;

这将防止在搜索之前进行架构查找,从而提高性能。

SELECT * 不适合高频查询。

【讨论】:

【参考方案2】:

是的,您绝对应该添加索引。

CREATE INDEX Post_author_id ON Posts(author_id);

作为进一步的证据,运行

EXPLAIN SELECT * FROM Posts WHERE author_id = 45 ORDER BY RAND() LIMIT 1;

【讨论】:

您添加索引的语法是否与此语法有任何不同? ALTER TABLE 帖子添加索引 (author_id) 是的,这些语法是不同的。 :-) ALTER TABLE 在数据库之间不是很便携,而CREATE INDEX 是非常可移植的。我讨厌 SQL,所以只记住了可移植的东西。【参考方案3】:

如果您还没有并在 author_id 上建立索引,请务必在其上添加一个。此外,我不确定 ORDER BY RAND() 是否对性能缺陷负责。尝试添加索引,它应该已经有了显着改善。

【讨论】:

【参考方案4】:

尤其是在您读取数据多于更新数据的情况下,在设置索引时要大方。 where 子句中的任何内容都应该被索引。

【讨论】:

【参考方案5】:

Author_id 上的 [可能是聚集的] 索引肯定会有所帮助。

ORDER BY RAND() 部分似乎还有一个额外的风险因素。本质上,该子句使 SQL 动态地为每一行分配一个随机数(对于给定的 Author_id),并对它们进行排序。随着一些多产的作者开始发布成千上万的帖子,这可能会成为瓶颈。

【讨论】:

【参考方案6】:

如果 author_id 是外键,则不需要创建索引。它具有内置索引。

【讨论】:

以上是关于MySQL 问题:列索引!的主要内容,如果未能解决你的问题,请参考以下文章

列索引的有效性是不是与列数据的熵有关

列索引超出范围,3 > 2。嵌套异常是 java.sql.SQLException:

如何查看MySQL数据库状态及信息(内存数据库编码格式表列索引等)

如何查看MySQL数据库状态及信息(内存数据库编码格式表列索引等)

2 列索引与 3 列索引的性能方面

无效的列索引错误 - 无法解决问题