Mysql效能優化

2021-10-09 21:00:24 字數 4036 閱讀 9931

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生成乙個執行計...