MySQL性能優化 - 存儲引擎與執行引擎

1、MySQL體系結構圖

2、插拔式存儲引擎

MySQL存儲的存儲引擎是插拔式的,指定在表之上,即一個庫中的每一個表都可以指定專用的存儲引擎。

不管採用什麼樣的存儲引擎結構,都會在數據區產生對應的一個frm文件(表結構定義描述文件)。

(1)CSV存儲引擎

即數據存儲在CSV文件中,特點:

> 不能定義索引,列定義必須爲not null,不能設置自增列。不適用大表或數據的在線處理。

> 數據存儲使用逗號隔開,可直接編輯CSV文件進行數據的編排。數據安全性低。

注:編輯後,要生效使用flush table xxx命令。

應用場景:數據的快速導入導出;表格直接轉換爲CSV。

(2)Archive存儲引擎

對數據進行壓縮存儲,數據存儲爲ARZ格式。特點

> 只支持insert和select操作

> 允許自增ID建立索引

> 行級鎖

> 不支持事物

> 數據佔用磁盤少

(3)Memory存儲引擎

數據存儲在內存中,IO效率比其他引擎高,服務重啓丟失數據,內存表數據默認是16M。

特點:

> 支持hash索引, B tree索引,默認是hash(查找複雜度0(1))

> 字段長度都是固定長度varchar(32)=char(32)

> 不支持大數據存儲類型,如blog、text

> 表級鎖

(4)Myisam

5.5版本之前的默認存儲引擎,特點:

> select count(*) from table 無須進行數據掃描

> 索引(MYI)和數據(MYD)分開存儲

> 表級鎖

> 不支持事物

(5)InnoDB

5.5版本之後的默認存儲引擎,特點:

> 事物ACID

> 行級鎖

> 聚集索引(主鍵索引)方式進行數據存儲

> 支持外鍵關係保證數據完整性

 

3、查詢優化

(1)查詢執行的路徑

 

(2)客戶端

半雙工工作模式,數據接收端一直等待數據傳輸結束。

查看mysql連接 show (full)processlist

線程狀態 sleep、query、locked、sorting result、sending data

通過 kill {id}

(3)查詢緩存

緩存sql查詢結果集和SQL,新的SQL先從緩存獲取數據。

判斷標準:判斷SQL語句是相同

緩存參數:

query_cache_type  0 不啓動緩存 1 啓動查詢緩存,SQL_NO_CACHE不緩存 2 啓動緩存,SQL添加參數 SQL_CACHE

query_cache_size  允許緩存的存儲大小,最新40K,默認1M

query_cache_limit  限制查詢緩存最大能存儲的結果集,默認1M

show status like '%Qcache%' 查詢緩存情況

查詢緩存不會被緩存的情況:

> 查詢語句中有一些不確定的數據時,不會被緩存,如now() ,curdate()等字段

> 查詢結果大於 query_cache_limit

> 對於InnoDB,事物修改一個表,事物提交前相關查詢緩存失效

> 查詢表示系統表

> 查詢語句不涉及表

(4)查詢優化器

> 使用等價變化規則 如:5=5 and a > 5  改爲 a > 5 或者 a < b and a =5 改爲 b > 5 and a = 5

> 優化 count、min、max等函數

min 函數只找索引最左表;max 找索引最右邊;myisam 引擎 count(*)

> 覆蓋索引

> 提前中止索引

> in 優化  先進行排序,然後使用二叉樹

(5)執行計劃

執行計劃id :select查詢序列號,id相同,執行順序由上而下,id不同,如果是子查詢id的序列號會遞增,id越大,執行優先級越高。

執行計劃select : 查詢從好到壞 system、const、eq_ref、ref、range、index、all

執行計劃extra:

using filesort 對外部文件排序,而不是表內的索引。

using temporary 臨時表保存中間結果,常見 order by 或 group by

using index 使用覆蓋索引,避免訪問表的數據行,效率高

using where 

select tables optimized away

3、定位慢查詢SQL

show variables like '%show_query_log%'

set global show_query_log = on

set global show_query_log_file = "/var/*.log"

set global log_queries_not_using_indexes=on

set global long_query_time = 0.1 (秒)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章