【问题标题】:Which indexes to create on a table that will contain millions of rows and multiple filters在包含数百万行和多个过滤器的表上创建哪些索引
【发布时间】:2020-12-22 05:42:32
【问题描述】:

我有一张包含数百万行的表格。用户可以在多个列上选择任何过滤器组合。例如:

  1. 年份
  2. 产品
  3. HSCode
  4. 章节
  5. 国家
  6. 端口
  7. 单位
  8. 进口商/出口商名称 10.打字

我计划强制选择年份过滤器。因此,Year 过滤器上的索引始终用于提高查询性能。

由于可以使用这些过滤器的任意组合(单个、多个、全部)- 我应该在表上设置什么样的索引?该表将非常庞大,保持这些查询的读取性能很重要

【问题讨论】:

    标签: mysql sql performance indexing query-optimization


    【解决方案1】:
    1. 了解通常使用的查询。
    2. 根据典型查询创建十几个 2 列索引。

    制作复合索引时:

    • 首先使用= 测试列。
    • 当使用范围(INLIKEBETWEEN 等)测试列时,索引中的后续列可能未使用。
    • LIKE 'no-wild-cards'IN ('one option') are the same as =`。
    • `LIKE 'blah%' 是一个“范围”测试。
    • LIKE '%blah 不能使用索引。
    • 为所有“文本”搜索增加一列;将所有“文本”列扔进去。 (可选地删除标点符号。)然后使用FULLTEXTMATCH
    • YearMonth 可能有问题;让我们看一些具体的例子。

    另见EAV

    【讨论】:

      【解决方案2】:

      对于您描述的任务,我建议使用像 Apache Solr 这样的搜索引擎。

      使用传统 MySQL 索引的问题是它们有固定数量的列,列是有序的,搜索必须使用第一个列。

      与在电话簿中查找姓名相比。您可以按姓氏查找一个人,因为姓氏是索引中的第一列。但是,如果您只需要按名字搜索某人,则它不是索引中的第一列,并且书籍的排序顺序也无济于事。

      因此,要优化搜索条件中任何列的搜索,您需要 N 列的 N 因子索引。

      而使用像 Apache Solr 这样的搜索引擎不会使用相同类型的索引。您可以使用任何属性子集搜索 Solr 索引。

      【讨论】:

      • 感谢您的建议。整个应用程序都基于这张表,因此现在很难将其更改为 solr。我想了解在 MySQL 本身中处理此问题的最佳方法
      • 你可以试试 MySQL 的全文索引。但是如果你使用常规索引,你必须知道要选择的列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2022-12-04
      • 2019-06-24
      相关资源
      最近更新 更多