5000w数据查询电话号码后4位,如何优化?¶
典型回答¶
这个问题,其实是一个典型的模糊查询的优化问题。首先看难点在哪?
5000万数据,纯全表扫,不用索引那肯定不现实,查询起来怎么也得10来秒了,太慢了,所以就一定要通过索引的方式来查询。
但是,要查询电话号码的后四位,SQL大概就是phone like "%1234",那因为这个查询是没有遵循最左前缀匹配的,所以就算phone字段有索引,也是无法命中索引的。
那么如果还要优化的话,有一个比较常见的方案,也是很多大厂都在用的方案,那就是把手机号分段存储。比如原来表中有一个phone字段,保存了完整的手机号,那么可以再多冗余3个字段,分别是phone_part1、phone_part2、phone_part3,分别存储手机号的前3位,中间4位和最后4位。然后再给这几个字段加一下索引。
之所以这么分,是因为大多数的手机号的查询都是通过前三位+后四位,或者直接通过后四位来做查询的。
有了这几个手机号的分段存储和索引之后,就可以完全按照phone_part3 = "1234"这样的方式去做查询了,这就可以完全命中索引了。
这是一种非常典型的用空间换时间的方法,这个方法也不是完美的(不是银弹),也有缺点,但是我觉得都不算啥大问题,比如:
1、浪费存储
2、手机号修改的话,需要一起改。
扩展知识¶
模糊查询优化方案¶
like还有其他的优化,比如字段逆序,但是不适合我们的场景,不过也可以结合着看。
加密后如何做模糊查询¶
本文的方案和这个方案比较像,可以结合着看。