如何解决在包含数百万行和多个过滤器的表上创建哪些索引
我有一个包含数百万行的表。用户可以在多列上选择任何过滤器组合。例如:
- 年份
- 月
- 产品
- HS编码
- 章节
- 国家
- 端口
- 单位
- 进口商/出口商名称 10.输入
我打算强制选择年份过滤器。因此,始终使用 Year 过滤器上的索引来提高查询性能。
既然使用了这些过滤器的任意组合(单个、多个、全部)- 我应该在表上有什么样的索引?该表将非常庞大,保持这些查询的读取性能很重要
解决方法
- 了解通常使用哪些查询。
- 根据典型查询创建十几个左右的 2 列索引。
制作复合索引时:
- 首先使用
=
测试列。 - 当使用范围(
IN
、LIKE
、BETWEEN
等)对列进行测试时,索引中的后续列可能未被使用。 -
LIKE 'no-wild-cards'
和IN ('one option') are the same as
=`。 - `LIKE 'blah%' 是一个“范围”测试。
-
LIKE '%blah
不能使用索引。 - 为所有“文本”搜索增加一列;将所有“文本”列扔进去。 (可选择删除标点符号。)然后使用
FULLTEXT
和MATCH
。 -
Year
和Month
可能有问题;让我们看一些具体的例子。
另见EAV
,我建议您使用 Apache Solr 之类的搜索引擎来完成您描述的任务。
使用传统 MySQL 索引的问题在于它们的列数是固定的,列是有序的,搜索必须使用第一个列。
与在电话簿中查找姓名相比。您可以按姓氏查找某人,因为姓氏是索引中的第一列。但是如果你只需要按名字搜索某人,它不是索引的第一列,书的排序顺序也无济于事。
因此,要按搜索条件中的任何列优化搜索,您需要 N 列的 N-factorial 索引。
而使用像 Apache Solr 这样的搜索引擎不使用相同类型的索引。您可以使用任何属性子集搜索 Solr 索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。