在專案開發中sql是必不可少的,表索也一樣.這些sql的執行效能不知道嗎?有多少是命中了索引的?命中哪個索引?索引中有哪個是無效索引?這些無效索引是否會影響系統的效能?帶著這些問題我們一起來學習一下.
mysql中是通過 explain 命令來分析低效sql的執行計畫。命令的使用很簡單.
示例 explain select * from adminlog
執行結果:
idselect_type
table
partitjons
type
possible_keys
keykey_len
refrow
filtered
extra
1******
adminlog
all2
100
執行結果每一列的說明:
1、 select_type
: 查詢型別,常見的值[******:簡單表,不使用表連線或子查詢。primary : 主查詢,外層的查詢。union 第二個或者後面的查詢語句。subquery : 子查詢中的第乙個select]
2、table
:輸出結果的表
3、type
: 表示mysql在表中找到所需行的方式,或者叫訪問型別。常見的型別:
allindex
range
refeq_ref
const,system
null
從左到右,效能由最差到最好。
3.1 type=all 全表掃瞄,
3.2 type=index 索引全掃瞄,遍歷整個索引來查詢匹配的行
3.3 type=range 索引範圍掃瞄,常見於 ,>=,between,in等操作符。
例 explain select * from adminlog where id>0 ,
explain select * from adminlog where id>0 and id<=100
explain select * from adminlog where id in (1,2)
3.4 type=ref 使用非唯一索引或唯一索引的字首掃瞄,返回匹配某個單獨值的記錄行。ref還經常出現在join操作中
3.5 type=eq_ref 類似於ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中有一條記錄匹配;簡單來說,說是多表連線中使用 主建或唯一健作為關聯條件
3.6 type=const/system 單錶中最多有乙個匹配行。主要用於比較primary key [主鍵索引]或者unique[唯一]索引,因為資料都是唯一的,所以效能最優。條件使用=。
3.7 type=null 不用訪問表或者索引,直接就能夠得到結果
例 explain select 1 from dual,型別type 還有其他值 如ref_or_null : 與ref 類似,區別在於條件中包含對null的查詢. index_merge : 索引合併優化, unique_subquery : in的後面是乙個主鍵欄位的子查詢。index_subquery : 與 unique_subquery 類似,區別在於in的後面是查詢非唯一索引欄位的子查詢
4、possible_keys
: 可能使用的索引列表.
5、key
: 實現執行使用索引列表
6、key_len
: 索引的長度
7、ref
: 顯示使用哪個列或常數與key一起從表中選擇行。
8、row
: 執行查詢的行數,簡單且重要,數值越大越不好,說明沒有用好索引
9、filtered:
10、extra
: 該列包含mysql解決查詢的詳細資訊。
10.1 not exists
10.2 range checked for each record
沒有找到合適的索引
10.5 using index 只使用索引樹中的資訊而不需要進一步搜尋讀取實際的行來檢索表中的資訊。就是建議取索引列。這樣就可以不要通過索引去實際表中找資料了。直接返回索引列的資料。一次查詢。否則就是索引表查一次,實際表中查一次。
10.6 using temporary
為了解決查詢,mysql需要建立乙個臨時表來容納結果。典型情況如查詢包含可以按不同情況列出列的group by和order by子句時。
無效索引
: 資料變化不大的列。如xx型別,是否有效,專案id等列的索引都是無效的。這些無效索引還是影響insert 、update、delete 語句的效能。因為這些語包的執行都要對索引表進行更新。又因為這些表的值變化不大,資料庫很難為他們合理分配索引。所以影響語句的效能。
in,or 是否會走索引
:一條sql會不會走索引乙個看條件使用的運算子,另乙個看有沒有索引。所以sql會不會走索引和in.or,group by 沒有關係。
什麼運算子不走索引,<>,!=
or 有個點要注意一下:就or前後兩個條件都要有索引整個sql才會使用索引。只要有乙個條件沒索引那麼整個sql都不使用索引。
如果出現or的乙個條件沒有索引時,建議使用
union
例:explain select * from cbdfinance.adminlog where id = 1
union select * from cbdfinance.adminlog where originaldata='updatemodelerrormsg';
結果:1
primary
adminlog
const
primary
primary
4const
1100.00
2union
adminlog
all11
10.00
using where
union result
allusing temporary
使用or第二個條件沒有索引:
explain select * from cbdfinance.adminlog where id = 1 or originaldata='updatemodelerrormsg';
結果:1
******
adminlog
allprimary
1118.18
using where
explain select * from cbdfinance.adminlog where id = 1 or id=2;
explain select * from cbdfinance.adminlog where id = 1 or searchtext1='updatemodelerrormsg';
explain select * from cbdfinance.adminlog where id in (1,2)
explain select * from cbdfinance.adminlog group by searchtext1
mysql覆蓋索引 你了解MySql覆蓋索引嗎?
簡單點來講,總是開篇簡單講,其實有的面試簡單說一下就夠啦,其實面試官就問你一下了解不了解。覆蓋索引是指,索引上的資訊足夠滿足查詢請求,不需要再回到主鍵上去取資料。下面詳細的講一下 覆蓋索引必須要儲存索引列的值,而雜湊索引 空間索引和全文索引不儲存索引列的值,所以mysql只能用b tree索引做覆蓋...
MySQL優化 SQL優化
其實sql語句的優化核心就在避免全表掃瞄上面 對查詢語句優化,避免全表掃瞄 首先應考慮在where及order by涉及的列上建立索引 避免在where子句中對字段進行表示式和函式操作 避免where進行null 等運算導致的全表掃瞄 在group by後面增加order by null就可以防止g...
Mysql優化 B Tree索引和Hash索引
b tree和普通的b tree不大一樣。有個 可以體驗這些資料結構 先看一下b tree 設定最大深度為3,插入10個數字,資料結構如上,他與普通的二叉樹區別在於每個節點有多個資料,相當於橫向擴充套件,減少深度。為什麼要減少深度 當資料量比較大的時候,mysql無法將索引全部載入到記憶體中,只能逐...