此文章主要向大家描述的是MySQL SQL優化的實際操作方案,同時還涉及一個MySQL數據庫查詢所使用index的問題,MySQL數據庫的強制索引Force Index)能實現哪些優化?以下的文章都有答案。
MySQL5下大數據量查詢優化的問題
推薦圈子: Database圈子
更多相關推薦 一般使用MySQL SQL的時候你是不會去想到優化。但是面對一個有SQL性能問題的數據庫時,我們應該如何入手進行系統的分析,使得能夠盡快定位問題SQL,並且盡快解決問題。
1.使用show status 命令了解各種MySQL SQL的執行頻率
引用
例如在MySQL的Cline上輸入
show status like 'Com_%';
顯示的是一些:Com_xxx.
Com_xxx 表示每個xx語句執行的次數。通常情況下我們比較關注如下一些操作:
引用
Com_select:執行select操作的次數
Com_insert:執行Insert操作的次數,對於批量插入的INSERT操作,只累加一次
Com_update:執行update操作的次數
Com_delete:執行Delete操作的次數
上面這些參數對於所有存儲引擎的表操作都會進行累加。下面有些參數只針對InnoDB存儲引擎的,累加的算法也有點不一樣。
引用
Innodb_rows_read:select查詢返回的行數
Innodb_rows_inserted:執行INSERT操作插入的行數
Innodb_rows_updated:執行Update操作更新的行數
Innodb_rows_deleted:執行Delete操作刪除的行數
通過上面的一些參數,我們可以了解當前數據庫的應用是以插入為主還是以查詢為主。以及各種類型的MySQL SQL大致的執行比例是多少。對於更新操作的計數,是對執行次數的計數,不管提交還是回滾都會進行累加。
對於事務型的應用,通過Com_commit和Com_rollback進行分析。如果回滾操作非常頻繁那麼要思考下是不是編寫存在問題。
下面有幾個參數用於了解數據庫的基本情況
引用
Connections:試圖連接MySQL服務器的次數執行的命令是:show status like 'Con_%';)
Uptime: 服務器工作時間執行的命令是:show status like 'Up_%';)
Slow_queries:慢查詢的次數執行的命令是:show status like 'Slow_%';)
2. 定位執行效率較低的SQL語句
要想定義效率較低的SQL可以按照下面兩種方式試試。
引用
1. 通過慢查詢日志定位那些執行效率較低的SQL語句,用 --log-slow-queries[=file_name]選項啟動時,MySQLd寫一個包含所有執行時間超過long_query_time秒的SQL語句的日志文件。
2. 慢查詢日志在查詢結束以後才記錄,所以在應用反映執行效率出現問題的時候進行查詢慢查詢日志並不能定位問題,可以使show processlist 命令查看當前MySQL在進行的線程,包括線程的狀態,是否鎖表等,可以實時地查看MySQL SQL的執行情況,同時對一些鎖表操作進優化。
3. 使用EXPLAIN分析低效SQL的執行計劃。
在查詢到效率低的SQL語句後,那我們可以使用explain或者DESC命令獲取Myswl如何執行SELECT語句的信息,包括在Select語句執行過程中表如何連接和連接的順序。
例如你想計數xxxx年公司的銷售額,那麼需要操作sales和comapny table,並對money字段進行sum操作。看看怎麼使用explain:
引用
explain select sum(moneys) from sales a company b where a.company_id = b.id and a.year=XXXX \G;(注意加上\G是為了更好的看)
顯示如下:
- id: 1
- select_type: SIMPLE
- table: a
- type: ALL
- possible_keys: NULL
- key:NULL
- key_len: NULL
- ref: NULL
- rows:1000
- Extra: Using where
- id: 2
- select_type: SIMPLE
- table: b
- type: ref
- possible_keys: ind_company_id
- key:ind_comapany_id
- key_len: 5
- ref: sakila.a.company_id
- rows:1
- Extra: Using where;Using index
下面解釋下每個列的含義:
引用
select_type: 表示SELECT的類型,常見的取值為SIMPLE(簡單表,不使用表連接或者子查詢)、PRIMARY(主查詢,即外層的查詢)、UNION、SUBQUERY
table: 輸出結果集的表
type: 表示表的連接類型,性能由好到差的類型類型為
(System(表中僅有一行,即常量表),
const(單表中最多有一個匹配行),
eq_ref(對於前面的每一行,在此表中只查詢一條記錄),
ref(使用普通的索引),
ref_or_null(和ref類似,但是條件中包含對於NULL查詢),
index_merge(索引合並優化),
unique_subquery(in的後面是一個查詢主鍵字段的子查詢),
index_subquery(類似unique_subquery,主要是in的後面是查詢非唯一索引字段的子查詢),
range(單表中的范圍查詢),
index(對於當前的每一行,都通過查詢索引來得到數據),
all(對於當前的每一行,都通過全表掃描來得到數據))
possible_keys: 表示查詢時,可能使用的索引
key:表示實際使用的索引
key_len:索引字段的長度
rows:掃描行的數量
Extra:執行情況的說明和描述
以上的相關內容就是對MySQL SQL優化的筆記的介紹,望你能有所收獲。