3. 索引介紹
3.3 常用索引分類
3.4 索引的儲存結構
3.5 組合索引使用(效能優化的門檻)
4. explain檢視執行計畫
5. 索引失效
6. mysql效能優化
7. sql語句優化(開發人員)
人們常說mysql效能優化有三駕馬車:慢查詢日誌、explain執行計畫(包括索引優化)、show profile(與硬體相關)本文主要從慢查詢日誌、explain執行計畫兩方面講述如何進行mysql的效能優化
使用【慢查詢日誌】功能,獲取所有查詢時間比較長的sql語句
其次【檢視執行計畫】檢視有問題的sql的執行計畫
最後可以使用【show profile[s] 檢視有問題的sql的效能使用情況】
e.g.
id是主鍵、name是非唯一索引
mysql在執行查詢時,一般情況下,只會用到乙個索引(優化器去進行選擇)
select * from user where id=1 and name=』zhangsan』;
mysql儲存引擎有許多種,常用的包括myisam(插入查詢快,不支援事務)、innodb、memory(臨時表)
再磁碟中儲存資料庫資訊有兩種形式,順序io和隨機io
順序io:追加操作 花費時間包括(傳輸時間)
隨機io:隨機操作 花費時間包括(尋道時間、旋轉時間、傳輸時間)
1.幫助mysql高效獲取資料的資料結構,加快資料庫查詢速度
2.(聚集索引、覆蓋所有、組合索引、字首索引、唯一索引等)都是使用b+樹等結構組織等索引
3.索引往往是儲存在磁碟上資料夾中
1.可以提高資料庫檢索效率,降低資料庫io成本
2.可通過索引進行排序
1.索引會佔據磁碟空間
2.索引雖然會提高查詢效率,但是會降低更新表的效率(插入資料索引也要更新)
1.普通索引
2.唯一索引 (可為null)
3.主鍵索引
1.再多個字段組合上建立的索引
2.組合索引的使用,需要遵循最左字首原則(最左匹配原則)
3.建議使用組合索引代替單列索引
索引在儲存引擎中實現,不同儲存引擎有不同的儲存結構
myisam和innodb只支援btree索引
memory和heap支援hash和btree索引
b樹非葉子結點儲存資料
b+樹只有葉子結點儲存資料
即索引組織表 表資料和索引在一起 索引存的是資料
儲存的是主鍵索引中的主鍵值,不是位址值
如果是非主鍵查詢,則需要搜尋兩次索引樹、一次是輔助索引樹、一次是主鍵索引樹,最終取出來資料。
若沒有主鍵索引,找唯一非空列,若還是找不到,則建立隱藏列
即堆組織表 索引存的是實體地址值
以下語句會建立一棵b+樹,但是他相當於三棵索引樹的功效
alter table 『table_name』add index index_name(『col1』,』col2』,』col3』)
1.常出現在where中的列、建議用來建立組合索引,組合索引中的順序是很重要的(mysql從左到右,oracle從右到左)
2.常出現在order by和group by語句中的列,最後按照順序去建立組合索引
3.常出現在select中的列,也建議按照順序,建立組合索引
mysql會一直向右匹配直到遇到範圍查詢(>、 3 and d=4如果建立(a,b,c, d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a, b, d的順序可以任意調整。
=和in可以亂序,比如a = 1 and b= 2 and c = 3建立(a,b,c)索引可以任意順序。mysq1的查詢優化器會幫你優化成索引可以識別的形式
1.主鍵自動建立唯一索引
2. 頻繁作為查詢條件的字段應該建立索引(業務)
3.多表關聯查詢中,關聯字段應該建立索引
4.查詢中統計或者分組字段,應該建立索引
5.查詢中排序的字段,應該建立索引
1.表記錄太少
2. 經常進行增刪改操作的表
3.頻繁更新的字段
4. where條件裡使用頻率不高的字段
explain命令用法非常簡單,在select語句前加上explain就可以了
顯示的是單位查詢的連線型別或者理解為訪問型別,訪問效能依次從好到差:
system(表中只有一行或空表)
const(使用唯一索引或主鍵)
eq_ ref(多表查詢,一般針對唯一索引)
ref(多表查詢,一般針對非唯一索引,=查詢或者字首索引查詢)
fulltext
ref or
null
unique subquery
index subquery
range(常見於< > in like)
index merge
index(沒有回表,在索引樹上就獲取了資料)
all(全表掃瞄)
注意事項:
除了all之外,其他的type都可以使用到索引
除了index merge之外,其他的type只可以用到一 個索引
最少要使用到range級別,以上都使用了索引
using index:表示使用了索引覆蓋,不需要回表查詢,通過索引就可以獲取查詢的結果資料
using where:使用了mysql server中的過濾資訊
物理分頁:在資料庫層面只返回分頁後的資料
邏輯分頁:在資料庫層面返回所有資料,在jvm記憶體中再對所有資料進行邏輯的分頁
icp索引下推即(5.6版本後)某些篩選在innodb層就進行篩選
以下情況會導致索引失效
1.全值匹配
2.最左字首法則
3.不在索引上做任何操作(計算、函式、型別轉換),這些操作會導致索引失效轉向全表掃瞄
4.儲存引擎不能使用索引範圍條件右邊的列
5.盡量使用覆蓋索引,減少select
6.mysql在使用不等於(!= < >)無法使用索引會導致全表掃瞄
7.is null, is not null 也無法使用索引
8.like以萬用字元%開頭,會使索引失效
9.字串不加單引號索引失效
10.少用or,用它連線時索引失效
將資料儲存在記憶體中,保證從記憶體讀取資料
建議innodb_buffer_pool_size設定為總記憶體大小的3/4或者4/5。
磁碟資料在mysql server啟動的時候,讀取到記憶體中
降低磁碟寫入次數
推薦innodb_log_file_size設定為0.35*innodb_buffer_pool_size
設計中間表,一般針對於統計分析功能,或者實時性不高的需求(oltp、olap)
為減少關聯查詢,建立合理的冗餘字段(考慮資料庫的三正規化和查詢效能的取捨.建立冗餘欄位還需要注意資料一致性問題)
對於欄位太多的大表,考慮垂直拆表(比如乙個表有100多個字段)
對於表中經常不被使用的字段或者儲存資料比較多的字段,考慮拆表(比如商品表中會儲存商品介紹,此時可以將商品介紹字段單獨拆解到另乙個表中,使用商品id關聯)
每張表建議都要有乙個主鍵 (主鍵索引), 而且主鍵型別最好是int型別.建議自增主鍵(不考慮分布式系統
●為搜尋字段( where中的條件)、 排序字段、select查詢列,建立合適的素引, 不過要考慮資料的業務場景:查詢多還是增刪多?
●盡量建立組合索引並注意組合索引的建立順序,按照順序組織查詢條件、 盡量將篩選粒度大的查詢條件放到是左邊。
●盡量使用覆蓋索引,select語句中盡量不要使用」。
●order by、 group by語句要盡量使用到索引
●盡量不使用count(*),使用count(主鍵)
●jion兩張表的關聯字段最好都建立索引,而且最好字段型別是一樣的。
●where條件中盡量不要使用1=1、not in語句(建議使用not exists)
●不用mysql內建的函式,因為內建函式不會建立查詢快取(比如 now())
mysql效能優化 mysql效能優化
優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...
mysql的效能優化 mysql效能優化
檢視安裝指令碼 select version 非互動式超時時間,如jdbc show global variables like wait timeout 互動式超時時間,如資料庫工具 show global variables like interactive timeout show sessi...
mysql 效能優化 命令 mysql效能優化
發現問題 當發現程式執行比較慢的時候,首先排除物力資源問題之後,就將注意力轉向mysq資料庫 1 首先確定執行慢的sql語句 mysql show full processlist 2 確認低效的查詢 多次執行第一步發現time耗費大的sql語句。檢視耗費的時間。3 分析效能 為sql生成乙個執行計...