在 Mysql 中处理多个索引时的最佳策略是什么
What's the best strategy when dealing with multiple indexes in Mysql
因此,我正在创建一个包含多个主题的网站,人们 post 这些主题中的内容,人们可以对这些内容发表评论。人们也可以对评论进行评论,但只能深入一层。所以会有评论和子评论,没有别的。对子评论的所有评论将作为主评论的子评论列出。我不喜欢 20 级深度注释,其中每个级别都用缩进标记。它破坏了我页面的外观。
现在我想到了 3 table。一个 table 用于包含内容编号和主题编号的内容。带有评论编号、内容编号和主题编号字段的评论 table。带有子评论编号、评论编号和内容编号以及主题编号的子评论 table。
现在我在思考在子评论table中分配索引时我的最佳策略应该是什么。我应该单独为子评论 ID 分配一个索引,还是应该为子评论 ID、评论 ID、内容 ID 和主题编号全部分配四个索引?
我通常会索引任何您可能 运行 查询的内容,特别是因为这是一个评论板,如果您希望有任何流量,不索引它们可能会严重减慢评论。
编辑:
这个决定实际上取决于您期望人为因素如何回应。该网站将加载更多索引更快,但更新可能会慢一点。由于不太可能多人同时更新信息,但人们通常希望先阅读,所以我会依靠更快的 select
时间。
MySQL 可以将多列索引用于测试索引中所有列的查询,或仅测试第一列、前 2 列、前 3 列等的查询。如果您在索引定义中以正确的顺序指定列,单个复合索引可以加速对同一 table.
的多种查询
许多人认为我们可以根据查询中使用的列创建每个索引。但事实并非如此。但是,在现实中,查询的性质本来应该指向正确的构造方法。这是最初的经验法则:
- 如果'Where'每个条件中的列都是用'AND'条件构造的,最好创建多列复合索引。
- 如果'Where'每个条件中的列都是使用'OR'条件构造的,则最好基于每个列创建多个索引。
- 聚簇索引应该有一个唯一键(我推荐的标识列)作为第一列。基本上它可以帮助您将数据插入到索引的末尾,而不会导致大量的磁盘 IO 和页面拆分。
- 如果您在数据上创建了其他索引,并且它们的构造巧妙,它们将被重用。
例如假设您在三列
上搜索 table
州、县、邮政编码。
您有时只按州搜索。您有时会按州和县搜索。您经常按州、县、邮编搜索。然后是州、县、邮编的索引。将用于所有这三个搜索。
如果您经常单独使用 zip 进行搜索,那么上面的索引将不会被使用(无论如何 SQL 服务器),因为 zip 是该索引的第三部分,查询优化器将看不到该索引很有帮助。
然后您可以单独在 Zip 上创建一个索引,该索引将在本实例中使用。
我想您正在寻找的答案取决于您经常使用的查询的 where 子句以及您的分组依据。
因此,我正在创建一个包含多个主题的网站,人们 post 这些主题中的内容,人们可以对这些内容发表评论。人们也可以对评论进行评论,但只能深入一层。所以会有评论和子评论,没有别的。对子评论的所有评论将作为主评论的子评论列出。我不喜欢 20 级深度注释,其中每个级别都用缩进标记。它破坏了我页面的外观。
现在我想到了 3 table。一个 table 用于包含内容编号和主题编号的内容。带有评论编号、内容编号和主题编号字段的评论 table。带有子评论编号、评论编号和内容编号以及主题编号的子评论 table。
现在我在思考在子评论table中分配索引时我的最佳策略应该是什么。我应该单独为子评论 ID 分配一个索引,还是应该为子评论 ID、评论 ID、内容 ID 和主题编号全部分配四个索引?
我通常会索引任何您可能 运行 查询的内容,特别是因为这是一个评论板,如果您希望有任何流量,不索引它们可能会严重减慢评论。
编辑:
这个决定实际上取决于您期望人为因素如何回应。该网站将加载更多索引更快,但更新可能会慢一点。由于不太可能多人同时更新信息,但人们通常希望先阅读,所以我会依靠更快的 select
时间。
MySQL 可以将多列索引用于测试索引中所有列的查询,或仅测试第一列、前 2 列、前 3 列等的查询。如果您在索引定义中以正确的顺序指定列,单个复合索引可以加速对同一 table.
的多种查询许多人认为我们可以根据查询中使用的列创建每个索引。但事实并非如此。但是,在现实中,查询的性质本来应该指向正确的构造方法。这是最初的经验法则:
- 如果'Where'每个条件中的列都是用'AND'条件构造的,最好创建多列复合索引。
- 如果'Where'每个条件中的列都是使用'OR'条件构造的,则最好基于每个列创建多个索引。
- 聚簇索引应该有一个唯一键(我推荐的标识列)作为第一列。基本上它可以帮助您将数据插入到索引的末尾,而不会导致大量的磁盘 IO 和页面拆分。
- 如果您在数据上创建了其他索引,并且它们的构造巧妙,它们将被重用。
例如假设您在三列
上搜索 table州、县、邮政编码。
您有时只按州搜索。您有时会按州和县搜索。您经常按州、县、邮编搜索。然后是州、县、邮编的索引。将用于所有这三个搜索。
如果您经常单独使用 zip 进行搜索,那么上面的索引将不会被使用(无论如何 SQL 服务器),因为 zip 是该索引的第三部分,查询优化器将看不到该索引很有帮助。
然后您可以单独在 Zip 上创建一个索引,该索引将在本实例中使用。
我想您正在寻找的答案取决于您经常使用的查询的 where 子句以及您的分组依据。