mysql 查詢效能排序,從左至右,效能由最差到最好
all index range ref eq_ref const/system null
1.all 全表掃瞄
例:select * from user
2.index 索引全掃瞄
例:select id from user
3.range 索引範圍掃瞄(>、=、<=、=、between等)
例:select * from user where id >= 5
4.ref 使用非唯一索引掃瞄,或唯一索引的字首掃瞄
例:select * from user where id = 5
join中也常出現ref
5.eq_ref 使用唯一索引(多表連線用主鍵或unique key作關聯條件)
例:select * from teacher a, student b where a.id = b.id
6.const/system 常量
例:select * from(select * from user where id = 1)
備註:臨時表中最多有乙個匹配行(主鍵不重複),mysql會當成常量
等於是select * from 常量
7.null 不用查就有結果
例:select 1 from user
索引在儲存引擎層實現,所以每種儲存引擎的索引不一定相同,也不一定都互相支援
4種索引:
b-tree、hash、r-tree、full-text
b-tree最常見,基本都支援
hash索引適用於key-value查詢,不適用範圍查詢(、<=、>=),memory支援
r-tree空間索引,不常用
full-text全文索引,5.6開始支援
如果列名為索引,使用column_name is null 就會使用索引,此處區別oracle
索引存在,但不能使用的情況
1. like '%值',(前任意後精確)
例:select * from user where name like '%war3'
2.資料型別隱式轉換
例:select * from user where id = 1
id是字元型,這裡寫了數字
3.不滿足最左原則匹配
例:alter table warcraftiii add index idx(id,team,race)
新增復合索引idx
select * from warcraftiii where id = 5 可用索引
select * from warcraftiii where id = 5 and team = 'we' 可用索引
select * from warcraftiii where team = 'mym' and race = 'hum' 索引不可用
查id、id,team、id,race、id,team,race、都走索引,但是,查team,race不走
4.mysql估計用索引比全表掃瞄慢
(mysql內部有個sql優化器)
5.用or時,乙個是索引,乙個不是
是索引的那列,不會走索引
mysql 索引優化器 Mysql之查詢優化器
對於乙個sql語句,查詢優化器先看是不是能轉換成join,再將join進行優化 優化分為 1.條件優化 2.計算全表掃瞄成本 3.找出所有能用到的索引 4.針對每個索引計算不同的訪問方式的成本 5.選出成本最小的索引以及訪問方式 開啟查詢優化器日誌 開啟 set optimizer trace en...
mysql統計查詢優化 Mysql查詢優化
效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...
MySQL查詢優化之COUNT
count 聚合函式,以及如何優化使用了該函式的查詢,很可能是mysql中最容易被誤解的前10個話題之一,在網上隨便搜尋一下就能看到很多錯誤的理解,可能比我們想象的多得多。在做優化之前,先來看看count 函式的真正作用是什麼。count 的作用 count 的另外乙個作用是統計結果集的行數。當my...