【问题标题】:Indexing fields in 20 column table. Multiple conditions in one SQL WHERE clause20 列表中的索引字段。一个 SQL WHERE 子句中有多个条件
【发布时间】:2012-07-12 11:02:05
【问题描述】:

我目前正在开始创建一个应用程序,其中最重要的部分是一个包含 20 列的表格。该表将来将包含 3-5-7k 条记录。我必须将此特定表中的一个 WHERE 子句中的多个列组合起来以进行过滤(小于、等于等)。 这些列是 varchars、ints、decimal 和 date。 所以我的问题是,如果我假设有 3k 行,如果在 WHERE 子句中使用全部或超过 10 个条件,我的查询可能会慢一点,我如何决定要索引哪些列。如何优化这样的查询。我知道 3-5-7k 行对 MySQL 来说不算什么。问题是我在表中有 20 列。如果这很重要,我也会在服务器上使用 PHP。

提前致谢。

【问题讨论】:

    标签: mysql sql database indexing where-clause


    【解决方案1】:

    确定主键后(这应该是比性能优化更好的逻辑猜测),您可以向表中添加额外的索引。

    您必须记住,在给定的表引用中,mysql 一次只能有效地使用一个索引。引擎现在确实有可能在内部合并各种索引,然后同时使用它们,但性能不是很好。 (见:http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge

    我的建议是您确定一组要处理的查询(最终也与其他表连接),然后,如果过滤字段过多,请确定最有效的过滤字段/在记录中。 如何知道什么是最有效的?例如,一个非空唯一字段非常适合:mysql 会像 ligtning 一样快地过滤掉这个字段。

    一般来说,经验法则是选择一个高度区分的列/列集:值不应重复太多次,否则索引效率会低。

    这是一个开始。

    问候

    【讨论】:

      【解决方案2】:

      每个表都有特定的行为。我们必须分析每个案例。

      一般来说,为了快速搜索,您应该在 where 中包含的 20 列中的每一列中创建一个索引。另一方面,这会减慢“插入”并占用大量空间索引。 因此,我们应该分析是否在每一列中添加索引。

      决定哪一列不应该是这个索引的一些技巧:

      • 避免重复列有值,执行计划不要使用你的 索引。
      • 避免使用索引类型:varbinary。
      • 更新程度高的列。

      【讨论】:

        猜你喜欢
        • 2021-12-06
        • 2019-02-09
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多