【问题标题】:What's the best strategy when dealing with multiple indexes in Mysql在Mysql中处理多个索引时最好的策略是什么
【发布时间】:2015-07-09 12:08:00
【问题描述】:

所以我正在创建一个包含多个主题的网站,人们在这些主题中发布内容,人们可以对内容发表评论。人们也可以对 cme​​ts 发表评论,但只有一层深度。所以会有 cmets 和 subcmets,没有别的。子cmets 上的所有cmets 都将作为子cmets 列在主评论中。我不喜欢 20 级深的 cmets,其中每个级别都用缩进标记。它破坏了我页面的外观。

现在我想在这里放 3 张桌子。一张包含内容编号和主题编号的内容表。带有评论编号、内容编号和主题编号字段的评论表。子评论表,包含子评论号、评论号、内容号和主题号。

现在我正在考虑在子注释表中分配索引时我的最佳策略应该是什么。我应该单独为 subcomment id 分配索引,还是应该将 subcomment id、comment id、content id 和主题编号全部分配四个索引?

【问题讨论】:

    标签: mysql database-indexes


    【解决方案1】:

    MySQL 可以将多列索引用于测试索引中所有列的查询,或者只测试第一列、前 2 列、前 3 列等的查询。如果您在索引定义中以正确的顺序指定列,则单个复合索引可以加快对同一张表的多种查询。

    许多人认为我们可以根据查询中使用的列创建每个索引。但事实并非如此。但是,实际上,查询的本质应该是指向正确的构造方式。这是最初的经验法则:

    • 如果“Where”中每个条件的列都是用“AND”条件构造的,最好创建多列复合索引。
    • 如果“Where”中的每个条件的列都是使用“OR”条件构造的,则最好基于每个列创建多个索引。
    • 聚集索引应该有一个唯一的键(我推荐一个标识列)作为第一列。基本上它可以帮助您在索引末尾插入数据,并且不会导致大量磁盘 IO 和页面拆分。
    • 如果您在数据上创建了其他索引并且构造巧妙,它们将被重复使用。

    例如假设您在三列上搜索表格

    州、县、邮编。

    您有时只按州搜索。您有时会按州和县进行搜索。您经常按州、县、邮编搜索。然后是州、县、邮编的索引。将用于所有这三个搜索。

    如果您经常单独通过 zip 进行搜索,那么上述索引将不会被使用(无论如何,SQL Server 都不会使用),因为 zip 是该索引的第三部分,查询优化器不会认为该索引有帮助。

    然后,您可以单独在 Zip 上创建一个索引,该索引将在此实例中使用。

    我猜你正在寻找的答案是它取决于你经常使用的查询的 where 子句以及你的 group by。

    【讨论】:

      【解决方案2】:

      我通常会将您可能从中运行查询的任何内容编入索引,特别是因为这是一个评论板,如果您希望获得任何流量,不编入索引可能会严重减慢 cmets 的呈现速度。

      编辑: 该决定实际上取决于您期望人为因素如何响应。该站点将通过更多索引加载更快,但更新可能会慢一些。由于多人不太可能同时更新信息,但人们通常想先阅读,我会倾向于更快的select 时间。

      【讨论】:

      • 索引太多有什么坏处吗?比如有什么取舍吗?
      • 更多索引会加快选择,但会减慢插入、更新和删除。基本上,您只需要决定检索数据然后更新数据是否更重要。想想用例模型。在这种特殊情况下,我会严重依赖更快的选择;您不希望人们在等待加载时离开您的网站。如果他们在评论?他们已经想被听到了。
      猜你喜欢
      • 2021-07-29
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 2011-02-10
      • 1970-01-01
      • 2010-10-25
      • 2015-12-13
      相关资源
      最近更新 更多