Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL问题:列上的索引!_Sql_Mysql_Indexing - Fatal编程技术网

MySQL问题:列上的索引!

MySQL问题:列上的索引!,sql,mysql,indexing,Sql,Mysql,Indexing,我有个问题 我有两个表(posts和authors),它们是一对多的关系(因为每个post都是由一个作者编写的,一个作者可以编写多个post) 以下是表格: Authors: id:BIGINT, name:VARCHAR(255) Posts: id:BIGINT, author_id:BIGINT, body:TEXT 我知道这是对的,但当我有4000人同时在线时,大约需要6秒钟 也许在Posts表中为author_id列编制索引可以加快速度 谢谢大家!:) 索引应该反映最流

我有个问题

我有两个表(posts和authors),它们是一对多的关系(因为每个post都是由一个作者编写的,一个作者可以编写多个post)

以下是表格:

Authors: id:BIGINT, name:VARCHAR(255) Posts: id:BIGINT, author_id:BIGINT, body:TEXT 我知道这是对的,但当我有4000人同时在线时,大约需要6秒钟

也许在Posts表中为author_id列编制索引可以加快速度


谢谢大家!:)

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

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

SELECT id,author_id,body 
FROM Posts 
WHERE author_id = 45 
ORDER BY RAND() 
LIMIT 1;
这将防止在搜索之前进行模式查找,从而提高性能


选择*对于高频查询是有害的。

是的,您肯定应该添加索引

CREATE INDEX Post_author_id ON Posts(author_id);
作为进一步的证据,运行

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

如果你没有在作者id上建立索引,一定要在上面放一个。另外,我不确定ORDER BY RAND()是否对性能缺陷负责。尝试添加索引,它应该已经有了显著的改进。

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

Author\u id上的[可能聚集]索引肯定会有所帮助


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

如果作者id是外键,则不需要创建索引。它有内置索引。

添加索引的语法是否与此索引有任何不同?ALTER TABLE POST添加索引(作者id)是的,这些语法不同。:-)
altertable
在数据库之间的可移植性不强,而
createindex
的可移植性非常好。我讨厌SQL,所以我只记得便携的东西。
EXPLAIN SELECT * FROM Posts WHERE author_id = 45 ORDER BY RAND() LIMIT 1;