Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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 应该为哪些内容编制索引以提高性能?_Mysql_Sql_Indexing - Fatal编程技术网

Mysql 应该为哪些内容编制索引以提高性能?

Mysql 应该为哪些内容编制索引以提高性能?,mysql,sql,indexing,Mysql,Sql,Indexing,给定此查询,应为哪些列编制索引以优化查询性能 SELECT * FROM `activities` WHERE (user_id = 90000 AND activity_type_id IN(300,400,808,9494)) ORDER BY created_at DESC LIMIT 70 当然,WHERE子句中的所有列都应该编制索引 但是IN子句可能需要表扫描 我认为阅读这些答案可能会有所帮助: 当然,WHERE子句中的所有列都应该编制索引 但是IN子句可能需要表扫描 我认

给定此查询,应为哪些列编制索引以优化查询性能

SELECT *
  FROM `activities`
 WHERE (user_id = 90000 AND activity_type_id IN(300,400,808,9494))
 ORDER BY created_at DESC
 LIMIT 70

当然,WHERE子句中的所有列都应该编制索引

但是IN子句可能需要表扫描

我认为阅读这些答案可能会有所帮助:


当然,WHERE子句中的所有列都应该编制索引

但是IN子句可能需要表扫描

我认为阅读这些答案可能会有所帮助:


您正在查找用户id和活动类型id,所以在这两列上创建索引。

您正在查找用户id和活动类型id,所以在这两列上创建索引。

我只索引用户id。

我只索引用户id。

假设您没有隐藏实际生产代码上的连接,为“活动类型”id编制索引应该是最好的。

假设您没有在实际生产代码中隐藏联接,为“活动类型”id编制索引应该是最好的。

一般来说,选择筛选器可以按任意顺序使用“用户id”或“活动类型”id上的索引或两者上的索引

排序操作可能能够在上使用筛选器

对于这个查询,假设MySQL能够实际使用它,那么用户id、活动类型id的复合索引可能会给出最佳结果。如果做不到这一点,索引用户id可能比索引活动类型id更好,因为它可能提供更好的选择性。考虑这一点的一个原因是,如果它在活动类型id上使用索引,则需要扫描索引的4个子部分,而如果它仅在用户id上使用索引,则只需要扫描一个子部分


试图依靠索引来进行排序顺序可能意味着要进行完整的表扫描,因此不太可能有什么好处。我不会在已创建的上创建索引以支持此查询;可能还有其他一些查询会对您有所帮助。

一般来说,选择筛选器可以按任意顺序使用用户id或活动类型id上的索引,或同时使用这两个索引

排序操作可能能够在上使用筛选器

对于这个查询,假设MySQL能够实际使用它,那么用户id、活动类型id的复合索引可能会给出最佳结果。如果做不到这一点,索引用户id可能比索引活动类型id更好,因为它可能提供更好的选择性。考虑这一点的一个原因是,如果它在活动类型id上使用索引,则需要扫描索引的4个子部分,而如果它仅在用户id上使用索引,则只需要扫描一个子部分


试图依靠索引来进行排序顺序可能意味着要进行完整的表扫描,因此不太可能有什么好处。我不会在已创建的上创建索引以支持此查询;可能还有其他一些查询会对您有所帮助。

我会在activities表中添加两个索引,一个关于user\u id、activity\u type\u id,另一个关于created\u dt。我还将认真研究“活动”表中的哪些字段被实际使用;如果可以减少检索的字段数,则可以缩短响应时间。我还将在对数据库进行任何更改之前获取查询计划,然后将其与进行任何/所有更改后生成的计划进行比较


共享和享受。

我会在活动表中添加两个索引,一个关于用户id、活动类型id,另一个关于创建的id。我还将认真研究“活动”表中的哪些字段被实际使用;如果可以减少检索的字段数,则可以缩短响应时间。我还将在对数据库进行任何更改之前获取查询计划,然后将其与进行任何/所有更改后生成的计划进行比较


共享和享受。

我根本不会创建任何额外的索引,相反,我会设计我的表,让它充分利用innodb集群主键

create table activities
(
user_id int unsigned not null,
activity_id smallint unsigned not null,
primary key (user_id, activity_id) -- composite clustered primary key order is important
)
engine=innodb;

此外,请阅读以下内容:


希望它能帮助并记住innodb FTW

我根本不会创建任何额外的索引,相反,我会设计我的表,让它充分利用innodb集群主键

create table activities
(
user_id int unsigned not null,
activity_id smallint unsigned not null,
primary key (user_id, activity_id) -- composite clustered primary key order is important
)
engine=innodb;

此外,请阅读以下内容:


希望它能帮助并记住innodb FTW

要做出正确的决定,您必须考虑以下因素:

如果用户id是主键的一部分,那么主键是表的聚集索引吗?如果是,用户id是否在聚集索引的第一个位置?如果是,那么您希望每个用户有多少活动?如果每个用户有1-40个活动,那么添加另一个索引将没有用处,并且会影响插入性能。原因是一个用户的所有活动行都将聚集在一起,并且可能位于同一个数据库页上,因此将活动类型id添加到索引将没有帮助

如果没有 主键未聚集且用户id不在主键中的第一个位置,或者用户id不在主键中,那么您最好选择具有用户id的非聚集索引,activity_type_id。查询优化器应该足够聪明,可以使用索引,因为即使存在in子句,user_id和activity_type_id都在where语句中。您还可以在索引的末尾添加created_,因为这样对查询结果进行排序


在为一个查询专门创建索引时要小心,但如果该查询被大量使用,则通常是必要的。

要做出正确的决策,您必须考虑以下几点:

如果用户id是主键的一部分,那么主键是表的聚集索引吗?如果是,用户id是否在聚集索引的第一个位置?如果是,那么您希望每个用户有多少活动?如果每个用户有1-40个活动,那么添加另一个索引将没有用处,并且会影响插入性能。原因是一个用户的所有活动行都将聚集在一起,并且可能位于同一个数据库页上,因此将活动类型id添加到索引将没有帮助

如果主键未聚集且用户id不在主键中的第一个位置,或者用户id不在主键中,则最好选择具有用户id的非聚集索引,activity_type_id。查询优化器应该足够聪明,可以使用索引,因为即使存在in子句,user_id和activity_type_id都在where语句中。您还可以在索引的末尾添加created_,因为这样对查询结果进行排序


在为一个查询专门创建索引时要小心,但是如果查询被大量使用,这通常是必要的。

您能提供更多关于模式的信息吗?例如,user_id是否是主键,因此已经有了唯一的索引?@Cole:user_id不太可能是活动表中唯一的主键列。它可能是主键的一部分。@Jonathan谢谢,我刚刚意识到我从未考虑过向自己的表中添加复合键。我必须记住这些。你能提供更多关于模式的信息吗?例如,user_id是否是主键,因此已经有了唯一的索引?@Cole:user_id不太可能是活动表中唯一的主键列。它可能是主键的一部分。@Jonathan谢谢,我刚刚意识到我从未考虑过向自己的表中添加复合键。我必须记住这些。