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 (秒)