SQLServer2005 50万记录多个LIKE性能优化

时间:2021-03-20 04:37:10
数据库使用的SQLSERVER2005,其中有一个表TEMP:

1、有字段A,字段B,字段C,字段D,字段1,字段2,字段3.。。。。

2、字段A,字段B,字段C,字段D 分别建立了索引;字段类型均为varchar

3、表记录数大概在50万~80万

要查询记录时使用多个字段like查询,语句如下:
SELECT * FROM TEMP WHERE 字段1 LIKE 'xxx' or  字段2 LIKE 'xxx' or  字段3 LIKE 'xxx' or 字段4 LIKE 'xxx'

现在的情况很明显就是性能很低下,请问针对这种应用应该如何提供查询性能呢?大家目前都采用什么方案来解决?

请高手指教,谢谢!

11 个解决方案

#1


LIKE里不加通配符"%","_"的话,为何不用"字段=[值]"就行了呢?

#2


如果是 columnname like 'xxx' 而不是 columnname like '%xxx%',那不如用 columnname='xxx'.
如果是后者,那就没办法了.去一个字段值里去查找一些字串,是没办法利用索引的.

#3


A B C D建了索引,查询是 1 2 3 4.。。
这样的LIKE在2005不会走索引,在2008有可能,看数据分布
通常这样的条件查询只有走表扫描

#4


不好意思,写错了,带前后%号的
SELECT * FROM TEMP WHERE 字段1 LIKE '%xxx%' or 字段2 LIKE '%xxx%' or 字段3 LIKE '%xxx%' or 字段4 LIKE '%xxx%'

#5


那恐怕就帮不了你了.
能不用 link 的地方,尽量不用,否则性能会大受影响.

#6


我的这个数据量相对还是比较少的,对于还大点的数据量,而且这种多个字段模糊检索应该也是有的,他们一般都采用什么方法解决呢?

#7


其实,Like '%xxx%' 跟 Like 'xxx%' 是有差别的,
后者是可以用到索引的.所以楼主看能否改成 Like 'xxx%'的形式?

#8


什么样的几十万条的数据需要like查询?

#9


可能要使用全文索引,不过mssql的全文索引据说一般般

#10


可能的话,是否可以调整Where中的条件的先后次序,把命中率高的条件放前面?

#11


用全文索引吧,据说性能一般,但是会比你那4个like好。

#1


LIKE里不加通配符"%","_"的话,为何不用"字段=[值]"就行了呢?

#2


如果是 columnname like 'xxx' 而不是 columnname like '%xxx%',那不如用 columnname='xxx'.
如果是后者,那就没办法了.去一个字段值里去查找一些字串,是没办法利用索引的.

#3


A B C D建了索引,查询是 1 2 3 4.。。
这样的LIKE在2005不会走索引,在2008有可能,看数据分布
通常这样的条件查询只有走表扫描

#4


不好意思,写错了,带前后%号的
SELECT * FROM TEMP WHERE 字段1 LIKE '%xxx%' or 字段2 LIKE '%xxx%' or 字段3 LIKE '%xxx%' or 字段4 LIKE '%xxx%'

#5


那恐怕就帮不了你了.
能不用 link 的地方,尽量不用,否则性能会大受影响.

#6


我的这个数据量相对还是比较少的,对于还大点的数据量,而且这种多个字段模糊检索应该也是有的,他们一般都采用什么方法解决呢?

#7


其实,Like '%xxx%' 跟 Like 'xxx%' 是有差别的,
后者是可以用到索引的.所以楼主看能否改成 Like 'xxx%'的形式?

#8


什么样的几十万条的数据需要like查询?

#9


可能要使用全文索引,不过mssql的全文索引据说一般般

#10


可能的话,是否可以调整Where中的条件的先后次序,把命中率高的条件放前面?

#11


用全文索引吧,据说性能一般,但是会比你那4个like好。