sql优化通配符%不能放词首

HaleyZhang 发布于 2018/08/13 12:55
阅读 819
收藏 0
SELECT *
FROM car
WHERE NAME LIKE '%hh%';

优化中说%最好不要出现在词首,那应该怎么写查出包含hh的name呢?

加载中
0
icytail
icytail
SELECT *
FROM car
WHERE INSTR(NAME, 'hh') > 0;

 

2
魔力猫
魔力猫

百分号这种通配符最好不要出现在开头的意思,是因为这样写,索引无法匹配,而不是不能这么写。这么写本身,是符合语法的,但是性能是否能满足你,就要看实际运行情况了。

百分号、问号,这样的通配符,如果只出现在结尾,普通索引可以扫描。如果只出现在开头,反向索引可以扫描。如果前后都有,那么索引就彻底凉了。

魔力猫
魔力猫
回复 @HaleyZhang : 不是好不好,而是是不是需要优化。全表扫描并不代表就一定不可以接受。比如1秒内响应时间都可以接受,那么0.1秒还是0.01秒,有区别吗?
HaleyZhang
HaleyZhang
要是需求是前后都有百分号,还想优化,应该怎么写?
三轮大师
三轮大师
明白人
1
土豆与地瓜
土豆与地瓜
使用转义:
SELECT *
FROM car
WHERE NAME LIKE '%/hh%';
或者
SELECT *
FROM car
WHERE NAME LIKE '%[]hh%';
HaleyZhang
HaleyZhang
这样写什么都查不出来啊。。。。。
1
吕兵阳
吕兵阳
mysql的覆盖索引了解下。
0
坦途abc
坦途abc

他们说的是设计时候尽量不要有这样的需求,而不是说

LIKE '%hh%'

的另一种写法会比这种好

HaleyZhang
HaleyZhang
想查找某个字段中包含hh的信息,是不是只能%hh%这样写? 这样写性能又不好,可以改进吗?
0
p
polaris_he
放在前面不能走索引,会全表扫描。放后面可以走前缀索引
0
p
polaris_he
如果表不大,这样查询是可以的。要优化一般有两种方式。1建立全文索引;2采用es等搜索引擎
0
宇润-非洲black鬼人人得而诛之
宇润-非洲black鬼人人得而诛之

需要全文搜索需要用单独的搜索引擎

宇润-非洲black鬼人人得而诛之
宇润-非洲black鬼人人得而诛之
回复 @魔力猫 : 数据库自带的全文搜索不要提了,白白让人踩坑,直接上搜索引擎实在
魔力猫
魔力猫
数据库如果支持全文搜索索引是不需要额外搜索引擎的,但是这个大函数索引可能效率和成本不太好。
0
idoz
idoz

使用GIN 表达式索引就好了,如果使用正则的话建议使用pg_trgm 插件来完成

返回顶部
顶部