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数据库状态及信息(内存数据库编码格式表列索引等)