sql創建全文索引
⑴ 關於MSsql 全文索引 某些詞特別慢的問題
1. 執行計劃中明明有使用到索引,為什麼執行還是這么慢?
2. 執行計劃中顯示掃描行數為 644,為什麼 slow log 中顯示 100 多萬行?
a. 我們先看執行計劃,選擇的索引 「INDX_BIOM_ELOCK_TASK3(TASK_ID)」。結合 sql 來看,因為有 "ORDER BY TASK_ID DESC" 子句,排序通常很慢,如果使用了文件排序性能會更差,優化器選擇這個索引避免了排序。
那為什麼不選 possible_keys:INDX_BIOM_ELOCK_TASK 呢?原因也很簡單,TASK_DATE 欄位區分度太低了,走這個索引需要掃描的行數很大,而且還要進行額外的排序,優化器綜合判斷代價更大,所以就不選這個索引了。不過如果我們強制選擇這個索引缺純(用 force index 語法),會看到 SQL 執行速度更快少於 10s,那是因為優化器基於代價的原則並不等價於執行速度的快慢;
b. 再看執行計劃中的 type:index,"index" 代表 「全索引掃描」,其實和全表掃描差不多,只是掃描的時候是按照索引次序進行而不是行,主要優點就是避免了排序,但是開銷仍然非常大。
Extra:Using where 也意味著掃描完索引後還需要回表進行篩選。一般來說,鄭數得保證 type 至少達到 range 級別,最好能達到 ref。
在第 2 點中提到的「慢日誌記錄Rows_examined: 1161559,看起來是全表掃描」,這里更正為「全索引掃描」,掃描行數確實等於表的行數;
c. 關於伏叢咐執行計劃中:「rows:644」,其實這個只是估算值,並不準確,我們分析慢 SQL 時判斷准確的掃描行數應該以 slow log 中的 Rows_examined 為准。
4. 優化建議:添加組合索引 IDX_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID)
優化過程:
TASK_DATE 欄位存在索引,但是選擇度很低,優化器不會走這個索引,建議後續可以刪除這個索引:
select count(*),count(distinct TASK_DATE) from T_BIOMA_ELOCK_TASK;+------------+---------------------------+| count(*) | count(distinct TASK_DATE) |+------------+---------------------------+| 1161559 | 223 |+------------+---------------------------+
在這個 sql 中 REL_DEVID 欄位從命名上看選擇度較高,通過下面 sql 來檢驗確實如此:
select count(*),count(distinct REL_DEVID) from T_BIOMA_ELOCK_TASK;+----------+---------------------------+| count(*) | count(distinct REL_DEVID) |+----------+---------------------------+| 1161559 | 62235 |+----------+---------------------------+
由於有排序,所以得把 task_id 也加入到新建的索引中,REL_DEVID,task_id 組合選擇度 100%:
select count(*),count(distinct REL_DEVID,task_id) from T_BIOMA_ELOCK_TASK;+----------+-----------------------------------+| count(*) | count(distinct REL_DEVID,task_id) |+----------+-----------------------------------+| 1161559 | 1161559 |+----------+-----------------------------------+
在測試環境添加 REL_DEVID,TASK_ID 組合索引,測試 sql 性能:alter table T_BIOMA_ELOCK_TASK add index idx_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID);
添加索引後執行計劃:
這里還要注意一點「隱式轉換」:REL_DEVID 欄位數據類型為 varchar,需要在 sql 中加引號:AND T.REL_DEVID = 000000025xxx >> AND T.REL_DEVID = '000000025xxx'
執行時間從 10s+ 降到 毫秒級別:
1 row in set (0.00 sec)
結論
一個典型的 order by 查詢的優化,添加更合適的索引可以避免性能問題:執行計劃使用索引並不意味著就能執行快。
⑵ 怎麼MySql添加全文索引
使用索引是資料庫性能優化的必備技能之一。在MySQL資料庫中,有四種索引:聚集索引(主鍵索引)、普通索引、唯一索引以及我們這里將要介紹的全文索引(FULLTEXT INDEX)。
全文索引(也稱全文檢索)是目前搜索引擎使用的一種關鍵技術。它能夠利用「分詞技術「等多乎凳種演算法智能分析出文本文字中關鍵字詞的頻率及重要性,然後按照一定的演算法規則智能地篩選出我們想要的搜索結果。在這里,我們就不追根究底其底層實現原理了,現在我們來看看在MySQL中如何創建並使用全文索引。
在MySQL中,創建全文索引相對比較簡單。例如,我們有一個文章表(article),其中有主鍵ID(id)、文章標題(title)、文章內容(content)三個欄位。現在我們希望能夠在title和content兩個列上創建全文索引,article表及全文索引的創建SQL語句如下:
--創建article表
CREATE TABLE article (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT (title, content) --在title和content列上創建全文索引
);
上面就是在創建表的同時建立全文索引的SQL示例。此外,如果我們想要給已經存在的表的指定欄位創建全文索引,同樣以article表為例,我們可以使用如下SQL語句進行創建:
--給現有的article表的title和content欄位創建全文索引
--索引名稱為fulltext_article
ALTER TABLE article
ADD FULLTEXT INDEX fulltext_article (title, content)
在MySQL中創建全文索引之後,現在就該了解如何使用了。眾所周知,在資料庫中進行模糊查詢是使用LIKE關鍵字進行查詢,例如:
SELECT * FROM article WHERE content LIKE '%查詢字元串%'
那麼,我們使用全文索引也是這樣用的嗎?當然不是,我們必須使用特有的語法才能使用全文索引進行查詢。例如橡頃逗,我們想要在article表的title和content列中全文檢索指定的查詢字元串,可以如下編寫SQL語句:
SELECT * FROM article WHERE MATCH(title, content) AGAINST('查詢字元串')
強烈注意:MySQL自帶的全文索引只能用於資料庫引擎為MyISAM的數據表,如果是其他數據引擎,則全文索引不會生效。此外,MySQL自帶的全文索引只能對英文進行全文檢索梁賣,目前無法對中文進行全文檢索。如果需要對包含中文在內的文本數據進行全文檢索,我們需要採用Sphinx(斯芬克斯)/Coreseek技術來處理中文。本站將會在後續文章中對Sphinx以及Coreseek進行介紹。
備注1:目前,使用MySQL自帶的全文索引時,如果查詢字元串的長度過短將無法得到期望的搜索結果。MySQL全文索引所能找到的詞的默認最小長度為4個字元。另外,如果查詢的字元串包含停止詞,那麼該停止詞將會被忽略。
備注2:如果可能,請盡量先創建表並插入所有數據後再創建全文索引,而不要在創建表時就直接創建全文索引,因為前者比後者的全文索引效率要高。
⑶ SQL資料庫創建資料庫(sql創建資料庫)
1、選擇開始菜單中→程序→【ManagementSQLServer2008】→【SQLServerManagementStudio】命令,打開【SQLServerManagementStudio】窗口,並使用Windows或SQLServer身份驗證建立連接。
2、在【對攜遲象資源管理器】窗口中展開伺服器,然後選擇【資料庫】節點
3、右鍵單擊【資料庫】節點,從彈出來的快捷菜單中選擇【新建資料庫】命令。
4、執行上述操作後,會彈出【新建資料庫】對話框。在對話框、左側有3個選項,分別是【常規】、【選項】和【文件組】。完成這三個選項中的設置會後,就完成了資料庫的創建工作,5、在【資料庫名稱】文本框中輸入要新建資料庫辯穗李的名稱。例如,這里以「新建的資料庫」。
6、在【所有者】文本框中輸入新建資料庫的所有者,如sa。根據資料庫的使用情況,選擇啟用或者禁用【使用族埋全文索引】復選框。
7、在【資料庫文件】列表中包括兩行,一行是資料庫文件,而另一行是日記文件。通過單擊下面的【添加】、【刪除】按鈕添加或刪除資料庫文件。
8、切換到【選項頁】、在這里可以設置資料庫的排序規則、恢復模式、兼容級別和其他屬性。
9、切換到【文件組】頁,在這里可以添加或刪除文件組。
10、完成以上操作後,單擊【確定】按鈕關閉【新建資料庫】對話框。至此「新建的數據」資料庫創建成功。新建的資料庫可以再【對象資源管理器】窗口看到。
⑷ sql server 2008報錯全文表或全文索引視圖在其全文索引列中有多個 lcid
全文索引和查詢概念(摘自SQL聯機幫助)全文索引、查詢和同步化最主要的設計要求是,在注冊進行全文檢索的所有表上都有一個唯一的全文鍵列(或者單列主鍵)。全文索引對使用的重要字及其所在位置進行跟蹤。例如,假定有一個對DevTools表的全文索引。全文索引可能指出在Abstract列的第423個和第982個單詞處找到了單詞Microsoft,所在的行與ProctID6關聯。該索引結構支持對所有包含被索引單詞的項進行有效檢索,以及高級檢索操作,雀清如短語檢索和鄰近檢索。為防止全文索引因包含很多對檢索沒有幫助的詞而變得臃腫,a、and、is或the這類額外的詞都忽略不計。例如,指定""與指定"proctsorderedringsummermonths"是一樣的。有這兩個字元串的行都會被返回。目錄\Mssql\Ftdata\Sqlserver\Config下提供了多種語言的干擾詞列表。在安裝帶有全文檢索支持的Microsoft®SQLServer™時會創建這個目錄,並同時安裝干擾詞文件。干擾詞文件可以編輯。例如,高技術公司的系統管理員可以把單詞computer添加到他們的干擾詞表中去。(棚歲如果編輯干擾詞文件,則必須在更改生效之前重新填充全文目錄。)下表顯示了干擾詞文件及其相應的語言。干擾詞文件語言-----------------------Noise.chs簡體中文Noise.cht繁體中文Noise.dat語言中性Noise.deu德語Noise.eng英語(英國)Noise.enu英語(美國)Noise.esn西班牙語Noise.fra法語Noise.ita義大利語Noise.jpn日語Noise.kor韓文Noise.nld荷蘭語Noise.sve瑞典語在處理全文查詢時,檢索引擎將滿足檢條件的行的鍵值返回給MicrosoftSQLServer。比如有一個SciFi表,其中Book_No列是主鍵列。Book_NoWriterTitle---------------------------------------------A025AsimovFoundation''sEndV109VerneMysteriousIsland假定想使用一個全文檢索查詢來查找包含單詞Foundation的書名。在本例中,將從全文索引獲得值A025和A027。然後SQLServer用這些鍵值和其它欄的信息響應該查詢。下表顯示了存儲全文索引數據所使用的語言。這些語言基於SQLServer安裝期間選擇的Unicode排序規則區域設置標識符。Unicode排序規則區域設置標識符全文數據存儲所用的語言------------------------------------------------------中文注音符號(台灣)繁體中文漢語拼音簡體中文中文筆畫簡體中文中文筆畫(台灣)繁體中文荷蘭語荷蘭語英語(英國)英語(英國)法語法語通用Unicode英語(美國)德語德語德文電話簿德語義大利語義大利語日語日語日語Unicode日語韓文韓文韓文Unicode韓文西班牙語(現代)西班牙語瑞典/芬蘭語瑞典語此列表中沒有的其它所有Unicode排序規則區域設置標識符值都映射到使用空格分隔單詞的中性語言單詞的斷字元和詞干分隔符。說明Unicode排序規則區域設置標識符設置用於所有可進行全文索引的數據類型(如char、nchar等)。如果為char、varchar或text類型列的排序次序設置的語言類頃和前型,不是Unicode排序規則區域設置標識符語言,那麼在對char、varchar和text類型的列進行全文索引和查詢時,仍然使用Unicode排序規則區域設置標識符值。創建全文索引(以索引image列為例,其他類型欄位大致一樣)標題全文索引image列,全攻略!作者pengdali[原作]關鍵字全文索引imagehttp://www.cnblogs.com/Elong/archive/2005/08/31/227001.htmlhttp://www.soooi.com/jsj/ShowArticle.asp?ArticleID=2526