在包含数百万行和多个过滤器的表上创建哪些索引

Posted

技术标签:

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

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

    年份 月 产品 HSCode 章节 国家 端口 单位 进口商/出口商名称 10.打字

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

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

【问题讨论】:

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

制作复合索引时:

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

另见EAV

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

感谢您的建议。整个应用程序都基于这张表,因此现在很难将其更改为 solr。我想了解在 MySQL 本身中处理此问题的最佳方法 你可以试试 MySQL 的全文索引。但是如果你使用常规索引,你必须知道要选择的列。

以上是关于在包含数百万行和多个过滤器的表上创建哪些索引的主要内容,如果未能解决你的问题,请参考以下文章

具有数百万行的 Django 表

数百万行的数据库设计

在 Python 中合并具有数百万行的两个表

mysql中数百万行的基于键的分区

数据库中的数百万行,只需要这么多

在 SQL Server 2017 上创建具有 800+ 百万行的现有分区表的列存储索引