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 等等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM