當檢索數據庫時,爲了優化性能,咱們使用一種叫索引的數據結構。當執行一個查詢時,索引可以快速定位所需數據。 在這篇文章中,我將分享使用全文檢索處理小型項目的經驗,該項目使用倒排索引概念優化了查詢性能。
全文檢索是一種檢查記錄中的全部單詞以匹配提供的搜索條件的搜索技術(常常被搜索引擎所使用)。sql
讓咱們設想一個場景,一個電商網站想提供一個搜索功能,讓用戶可以使用相同的搜索字段對商品名稱,商品種類,商品描述進行搜索。這能夠經過Mysql的'LIKE'查詢對三個列(商品名稱,商品種類,商品描述)進行關鍵字搜索。數據庫
SELECT * FROM product_test WHERE name LIKE ‘%top%’ and category LIKE ‘%top%’ and description LIKE ‘%top%’;
上述查詢語句會隨着數據體量的增長而下降性能。使用'LIKE'語句,有些搜索字詞能夠被很好地索引而且(性能)表現更好,而其餘字詞卻不能被很好地索引從而提供更好的性能結果。基本上,通配符在查詢語句中的位置決定了性能的高低。數據結構
索引範圍越小,查詢越快
'LIKE'表達式包含兩個部分 a)訪問謂詞(在第一個通配符前的內容) b)篩選謂詞(除去訪問謂詞的其餘內容)
訪問謂詞應該更具選擇性,以使索引範圍更小,查詢更快。在上述示例中,'like'表達式不包含訪問謂詞,以至掃描了全部的記錄。函數
全文檢索技術使用了倒排索引的概念。倒排索引將每一個單詞映射到其在記錄或一組記錄中的位置。這種結構在全文檢索中有普遍的應用。我但願咱們全部人都可以熟悉這種數據結構,由於這種數據結構能夠影射爲現實中書本的索引,咱們能夠經過書本的索引找到對應主題的頁碼。倒排索引會告訴你特定搜索詞所在的記錄。性能
全文索引在MySQL中是一種名爲 FULLTEXT 類型的索引。FULLTEXT 索引能夠在建立表時建立,或者在建立表以後經過ALTER TABLE/CREATE INDEX,從VARCHAR、TEXT類型的列建立。優化
CREATE TABLE product_test (id INT PRIMARY KEY, name VARCHAR(200),category VARCHAR(200),description TEXT, FULLTEXT (name,category, description));
搜索由Match函數執行。Match函數將列名做爲參數,搜索的字詞做爲參數傳遞給Against函數。網站
SELECT id, MATCH (name,category, description) AGAINST (‘Top’) FROM product_test;
搜索結果默認按相關性的降序排序,相關性最高的記錄將先出現,而後出現相關性低的結果。搜索引擎
在30,000條記錄的上運行'LIKE'查詢語句,耗時0.062秒,全文檢索查詢耗時0.011秒。結果顯示,使用索引的全文檢索方式比'LIKE'語句更塊。spa