假设有一个列表界面, 有 10 个搜索条件, 每个条件对应表的某个字段,都是精确搜索。 但是表的数据有 100 万条。 这种情况下,复合索引无法设置,因为字段组合太多. 那么,有没有通用的解决方案,可以设置索引,让任何条件的搜索都能很快?
1
joApioVVx4M4X6Rf 2020-09-21 13:22:09 +08:00
同问
|
2
thinkmore 2020-09-21 13:57:56 +08:00
你设置过 10 个字段的组合索引吗?
比如你设置了 a_b_c_d_e 这样的索引,然后你的查询条件是 a = xxx and c=xxx and b = xxx,这样的精确查询,a_b_c_d_e 的索引也是会被使用到的。 |
4
simonlu9 2020-09-21 14:17:33 +08:00
上 es 吧,性能杠杠的
|
5
justNoBody 2020-09-21 14:25:03 +08:00
得根据业务来优化吧, 比如 2 楼说的方法其实是可行的, b tree 索引是可以从左开始匹配的. 所以如果有 10 个搜索条件, 看看能否让条件都变成必填且按顺序进行检索.
其次我看到楼主有提到都是精确搜索, 如果对模糊匹配无要求, 是不是考虑给每个字段都增加一个 hash 索引? 另外我觉得还可以做字段冗余, 把十个字段的值放一个字段上, 然后走分词索引. 或者借助于 ES 做全文搜索来匹配. |
6
wingpui 2020-09-21 14:29:04 +08:00
根据数据离散程度选择索引组合字段?
|
7
wangritian 2020-09-21 15:11:26 +08:00
和需求方沟通,先看看可不可以设置必填查询项,其次问高频使用的查询项
|
8
limuyan44 2020-09-21 15:19:27 +08:00
让任何条件都很快,绝招,10 个索引完事了。
|
9
littlewing 2020-09-21 15:22:42 +08:00 via iPhone
100 万条不多,随便玩,加 10 个索引最省事了
|
11
dajj OP 经过思考,我想了个方案,不知道怎么样。
简单来说,把所有用到的字段设置索引 (字段,创建时间), 这样如果只是查询该字段,那么至少有索引, 如果再加上 创建时间筛选, 那就能用到 复合索引,效率更高。 感觉是个好办法。 不过问题又来了, 对于模糊查找的字段,只能用文本索引, 比如 es, 那么 ES 支持关联查找码, 不关联的话, 复杂的统计查找应该怎么做呢 |