全面瞭解Mysql(六)索引、全文檢索

  1. B+樹索引
    1)聚集索引
    每張表只能有一個聚集索引,按照主鍵構造的一顆B+樹,葉子節點就是數據頁,查詢優化器傾向於聚集索引,因爲聚集索引的葉子節點直接能找到數據,我們可用使用explain 進行分析索引的使用
    在這裏插入圖片描述
    2)非聚集索引(輔助索引)
    非聚集索引中並不包含真實數據,而是有一個相應行的數據的聚集索引鍵,當查找數據時,先進行非聚集索引查詢接着進行聚集索引查詢才能找到真實數據。
    3)B+樹索引分裂
    根據B+樹的原理進行分裂的話,會導致葉子節點空閒空間過大,也就是不停的創建新頁,innodb的page header中有page_last_insert、page_direction、page_n_direction三個部分保存的數值影響着分裂點的確認,減少空閒空間。
    4)索引的創建和刪除
    創建alter table a add {index|key} name type(字段)、create index name type on tableName(字段)
    刪除drop index name on tableName
    可用使用命令show index from tablename來查看索引情況
    在這裏插入圖片描述
    其中我們比較關心cardinality的值,它應該儘可能的接近錶行數,如果太小可以刪除該索引了。
    如果是生產環境下,進行索引的變更需要考慮到成本問題了,5.5之前的版本變更是刪除該表並用新生成的表替換。
  2. 全文檢索
    全文檢索從innodb1.2版本開始支持
    innodb使用的是full inverted index{單詞,(單詞所在文檔的ID,在具體文檔中的位置)}表現形式的倒排索引。
    使用CREATE FULLTEXT INDEX idx_fts ON fts_a(body);創建全文檢索
    1)innodb將倒排索引存儲在輔助表Auxiliary Table中,爲了提高併發性能共有6張Auxiliary Table,每張表有兩列,一列是word,另一列是ilist字段,每張表根據word字段的latin編碼進行分區。爲了提高檢索性能,引入FTS index cache(一個基於紅黑樹的全文檢索索引緩存),那麼插入數據的順序是,先進行數據的入庫,再分詞然後結果跟新到FTS index cache,最後纔是入Auxiliary Table,可以設置參數innodb_ft_aux_table來觀察倒排索引
    在這裏插入圖片描述
    上面的圖中報以上錯誤 是因爲表中沒有一個字段是全文索引。
    當發生宕機時可能FTS index cache中的數據沒有同步到Auxiliary Table,當重啓數據庫後進行全文檢索時會自動讀取未完成的文檔進行分詞然後將結果放到FTS index cache中,innodb_ft_cache_size用來控制FTS index cache大小,默認32m。
    當刪除分詞時,不刪除Auxiliary Table中的記錄,只刪除FTS index cache中的記錄,但是會將其fts_doc_id保存在deleted Auxiliary Table中,當設置了innodb_ft_aux_table後,可以通過訪問information_schema.innodb_ft_deleted來查看刪除的記錄。
    當前版本的全文檢索不支持沒有單詞界定符的語言如中文,每張表只能有一個全文檢索索引
    2)全文檢索查詢
select *
from client
where match(account) against('admin' in natural language mode)

全文檢索有三種模式
1】默認natural language查詢帶有指定單詞的文檔
2】boolean 在查詢字符串前後添加特殊字符代表不同含義
+表示單詞必須存在
-表示單詞必須不存在
什麼都沒有代表單詞是可選的,出現相關性更高
@30表示查詢的多個單詞之間的距離必須在給定限制內
>表示出現該單詞時增加相關性
<出現該單詞時降低相關性
~出現該單詞時相關性爲負
*表示以某某開頭的單詞
''表示短語
3】query expansion將查詢單詞擴充爲相關單詞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章