对于多字段的组合搜索条件, mysql 应该怎么设置索引

2020-09-21 13:11:33 +08:00
 dajj

假设有一个列表界面, 有 10 个搜索条件, 每个条件对应表的某个字段,都是精确搜索。 但是表的数据有 100 万条。 这种情况下,复合索引无法设置,因为字段组合太多. 那么,有没有通用的解决方案,可以设置索引,让任何条件的搜索都能很快?

2512 次点击
所在节点    MySQL
11 条回复
joApioVVx4M4X6Rf
2020-09-21 13:22:09 +08:00
同问
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 的索引也是会被使用到的。
zoharSoul
2020-09-21 14:01:49 +08:00
@thinkmore
但是你查 b,e 这样的就用不到了.
simonlu9
2020-09-21 14:17:33 +08:00
上 es 吧,性能杠杠的
justNoBody
2020-09-21 14:25:03 +08:00
得根据业务来优化吧, 比如 2 楼说的方法其实是可行的, b tree 索引是可以从左开始匹配的. 所以如果有 10 个搜索条件, 看看能否让条件都变成必填且按顺序进行检索.
其次我看到楼主有提到都是精确搜索, 如果对模糊匹配无要求, 是不是考虑给每个字段都增加一个 hash 索引?

另外我觉得还可以做字段冗余, 把十个字段的值放一个字段上, 然后走分词索引. 或者借助于 ES 做全文搜索来匹配.
wingpui
2020-09-21 14:29:04 +08:00
根据数据离散程度选择索引组合字段?
wangritian
2020-09-21 15:11:26 +08:00
和需求方沟通,先看看可不可以设置必填查询项,其次问高频使用的查询项
limuyan44
2020-09-21 15:19:27 +08:00
让任何条件都很快,绝招,10 个索引完事了。
littlewing
2020-09-21 15:22:42 +08:00
100 万条不多,随便玩,加 10 个索引最省事了
thinkmore
2020-09-23 09:19:44 +08:00
@zoharSoul 对。如果只是 10 个条件任意某几个查询,这样就不如 10 个索引了。
dajj
2020-09-28 11:07:45 +08:00
经过思考,我想了个方案,不知道怎么样。
简单来说,把所有用到的字段设置索引 (字段,创建时间),
这样如果只是查询该字段,那么至少有索引, 如果再加上 创建时间筛选, 那就能用到 复合索引,效率更高。


感觉是个好办法。
不过问题又来了, 对于模糊查找的字段,只能用文本索引, 比如 es, 那么 ES 支持关联查找码, 不关联的话,
复杂的统计查找应该怎么做呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/709009

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX