高效能索引
寫在前面:
索引的三個優點:
- 索引大大減少了伺服器需要掃描的資料量
- 索引可以幫助伺服器避免排序和臨時表
- 索引可以將隨機 I/O 變為順序 I/O
- 索引一般分為:
主鍵索引:不能為空 不能重複
普通索引create index 索引名稱 on 表名(列名,)
drop index 索引名稱 on 表名
唯一索引:不能重複create unique index 索引名稱 on 表名(列名)
drop unique index 索引名稱 on 表名
聯合(組合)索引create unique index 索引名稱 on 表名(列名,列名)
drop unique index 索引名稱 on 表名
如果有組合索引,注意最左字首匹配,從最左邊開始匹配
注意索引合併只是配合兩個單獨的索引而已。
組合索引效率 > 索引合併效率
高效能索引策略
獨立的列
指的是索引列不能是表示式的一部分,也不能是函式的引數
不好的索引select actor_id from sakila.actor where actor_id+1 = 5
我們應該簡化 where 條件,始終將索引列單獨放在比較符號的一側。
不好的又一個示例:select ... where to_days(current_date) - to_days(date_col) <= 10
字首索引和索引選擇性
有時候需要索引很長的字元列,一個策略是模擬雜湊索引,還有一個策略是:通常可以索引開始的部分字元,但這會降低索引的選擇性。
索引的選擇性:不重複的索引值和資料表的記錄總數的比值,索引的選擇性越高查詢效率越高。唯一索引的選擇性是1,這是最好的索引選擇性,效能也是最好的。
對於 BLOB,TEXT 或很長的 varchar 型別列,必須使用字首索引。
缺點:MySQL 無法使用字首索引做 order by 和 group by,也無法使用字首索引做覆蓋掃描。
當然也可以創造字尾索引,只需將字串反向儲存即可。多列索引
通常“把 where 條件裡面的列都建上索引”這樣模糊的建議是錯誤的,在多個列上建立獨立的單列索引大部分情況並不能提高 MySQL 的查詢效能。有時可以優化索引列的順序。選擇合適的索引列順序
雜湊值少的不適合建索引
如性別聚簇索引
這是一種資料儲存方式。表資料按照索引的順序來儲存的,也就是說索引項的順序與表中記錄的物理順序一致。對於聚集索引,葉子結點即儲存了真實的資料行,不再有另外單獨的資料頁。
非聚簇索引
表資料儲存順序與索引順序無關。對於非聚集索引,葉結點包含索引欄位值及指向資料頁資料行的邏輯指標,其行數量與資料錶行資料量一致。覆蓋索引
在索引檔案中直接找到資料,只是一個名詞,不是真實的索引使用索引掃描來做排序
壓縮(字首壓縮)索引
MyISAM 使用字首壓縮來減少索引的大小。冗餘和重複索引
例如在 primary key 列上又建立 unique ,通常沒有必要。
還有建立了索引(A,B),再建立(A)就是冗餘索引,因為它是 (A,B)的字首索引。但(B,A),(B)就不是了。未使用的索引
有一些索引永遠不會被使用。建議刪除。
以下幾種情況不會命中索引:
like 使用函式, or,型別不一致 != > order by
or 可能會出現沒法走索引,但如果where 索引1=xxx or field=xxx and 索引2=xxx
它就會走索引
用 order by 的時候,注意取 order by 欄位,否則不會走索引。一般主鍵都有特殊性,對於 != < > 會走索引。
相關文章
- MYSQL索引及高效能索引策略MySql索引
- 高效能MySQL-索引MySql索引
- 高效能索引策略二索引
- Mysql-高效能索引MySql索引
- mysql之高效能索引MySql索引
- 高效能MySQL實戰(二):索引MySql索引
- 「MySQL」高效能索引優化策略MySql索引優化
- mysql覆蓋索引高效能的探究MySql索引
- MySQL 索引的型別——《高效能MySQL》MySql索引型別
- MySQL | 05 如何設計高效能的索引?MySql索引
- MySQL全面瓦解25:構建高效能索引(案例分析篇)MySql索引
- AntDB-M高效能設計之hash索引動態rehash索引
- 千萬級MySQL資料庫建立索引,提高效能的祕訣MySql資料庫索引
- 在分割槽表上使用正確的索引來提高效能索引
- 在laravel中使用mysql fulltext全文索引代替like查詢提高效能LaravelMySql索引
- 高效能儲存SIG月度動態:EROFS支援直接索引容器映象tar包等索引
- 《跬步千里系列》高效能MySql之索引到底是個啥MySql索引
- Python Numpy 切片和索引(高階索引、布林索引、花式索引)Python索引
- 主鍵索引 (聚集索引) 和普通索引 (輔助索引) 的區別索引
- MySQL 三年模擬五年面試之一網打盡系列(2)----- 建立高效能索引MySql面試索引
- mysql索引之字首索引MySql索引
- ElasticSearch 索引 VS MySQL 索引Elasticsearch索引MySql
- 理解索引:索引優化索引優化
- 從InnoDB 索引執行簡述 聚集索引和非聚集索引、覆蓋索引、回表、索引下推索引
- mongodb建立索引和刪除索引和背景索引backgroundMongoDB索引
- MySQL 字串索引和字首索引MySql字串索引
- MySQL索引系列:全文索引MySql索引
- SQL Server索引 - 非聚集索引SQLServer索引
- 索引索引
- MySQL 唯一索引和普通索引MySql索引
- mysql組合索引,abc索引命中MySql索引
- 索引與null(二):組合索引索引Null
- 什麼索引算是好的索引索引
- 索引與null(一):單列索引索引Null
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- ElasticSearch分片互動過程(建立索引、刪除索引、查詢索引)Elasticsearch索引
- MySQL索引(二):建索引的原則MySql索引