sql模糊查询效率

     在数据库量比较大的时候通常有一些查询,例如查询文本类型的数据,存储量大,用like进行模糊查询效率实在太低

    select * from stdcontent where  content like '%武器%'

     查询结果

     总共在568148条数据中筛选出来的结果,所以耗时比较大,反应数据返回去导致使用场景中在这反回的期间,用户在等,给用户展现出来的就是卡死状态,用户还想去点击其他的,导致程序崩溃。

     解决方案:用contains关键字。

     用法:select * from stdcontent where contains([content],'"*武器*"')

     查询结果

    两条查询结果在耗时速度上相差很多,在数据方面会有所相差,具体下面

全文索引——CONTAINS 语法 
我们通常在 WHERE 子句中使用 CONTAINS ,就象这样:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'search contents')。 

select CompanyName from T_Enterprise where CompanyName like '%CCC%'

查询结果:
CompanyName
-------------------------------- 可以查到
CCCCCCCCC

select CompanyName from T_Enterprise where  Contains(CompanyName,'CCC')
查询结果:
CompanyName
--------------------------------查不到数据

备注:该表已经进行全文索引!

再换另外一个关键字来查询下、

select COUNT(*) from T_Enterprise where CompanyName like '%公司%'      

select COUNT(*) from T_Enterprise where  Contains(CompanyName,'公司')

结果是使用Contains查询的记录数比Like少!

我们通过例子来学习,假设有表 students,其中的 address 是全文本检索的列。 
1. 查询住址在北京的学生 
SELECT student_id,student_name 
FROM students 
WHERE CONTAINS( address, 'beijing' ) 
remark: beijing是一个单词,要用单引号括起来。 

2. 查询住址在河北省的学生 
SELECT student_id,student_name 
FROM students 
WHERE CONTAINS( address, '"HEIBEI province"' ) 
remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。 

3. 查询住址在河北省或北京的学生 
SELECT student_id,student_name 
FROM students 
WHERE CONTAINS( address, '"HEIBEI province" OR beijing' ) 
remark: 可以指定逻辑操作符(包括 AND ,AND NOT,OR )。 

4. 查询有 '南京路' 字样的地址 
SELECT student_id,student_name 
FROM students 
WHERE CONTAINS( address, 'nanjing NEAR road' ) 
remark: 上面的查询将返回包含 'nanjing road','nanjing east road','nanjing west road' 等字样的地址。 
A NEAR B,就表示条件: A 靠近 B。 

5. 查询以 '湖' 开头的地址 
SELECT student_id,student_name 
FROM students 
WHERE CONTAINS( address, '"hu*"' ) 
remark: 上面的查询将返回包含 'hubei','hunan' 等字样的地址。 
记住是 *,不是 %。 

6. 类似加权的查询 
SELECT student_id,student_name 
FROM students 
WHERE CONTAINS( address, 'ISABOUT (city weight (.8), county wright (.4))' ) 
remark: ISABOUT 是这种查询的关键字,weight 指定了一个介于 0~1之间的数,类似系数(我的理解)。表示不同条件有不同的侧重。 

7. 单词的多态查询 
SELECT student_id,student_name 
FROM students 
WHERE CONTAINS( address, 'FORMSOF (INFLECTIONAL,street)' ) 
remark: 查询将返回包含 'street','streets'等字样的地址。 
对于动词将返回它的不同的时态,如:dry,将返回 dry,dried,drying 等等。
原文地址:https://www.cnblogs.com/ms1976/p/8667897.html