今天,數據庫的操作越來越成為整個應用的性能瓶頸了,這點對于Web應用尤其明顯。關于數據庫的性能,這并不只是DBA才需要擔心的事,而這更是我們程序員需要去關注的事情。當我們去設計數據庫表結構,對操作數據庫時(尤其是查表時的SQL語句),我們都需要注意數據操作的性能。
1、開啟慢查詢
1> 查看慢查詢是否開啟
| show variables like "%quer%";slow_query_log = ON #已開啟 |
2> 開啟方法:my.cnf目錄配置
| slow_query_log=on #是否開啟slow_query_log_file=/opt/MySQL_Data/TEST1-slow.log #慢查詢文件位置long_query_time=2 #查詢超過多少秒才記錄 |
2、EXPLAIN慢查詢日志里出現的SELECT查詢
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | user | NULL | ref | user | user | 768 | const | 1 | 100.00 | NULL |
explain列的解釋
table:顯示這一行的數據是關于哪張表的
type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、index、all
possible_keys:顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從where語句中選擇一個合適的語句
key: 實際使用的索引。如果為null,則沒有使用索引。很少的情況下,mysql會選擇優化不足的索引。這種情況下,可以在select語句中使用use index(indexname)來強制使用一個索引或者用ignore index(indexname)來強制mysql忽略索引
key_len:使用的索引的長度。在不損失精確性的情況下,長度越短越好
ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數
rows:mysql認為必須檢查的用來返回請求數據的行數
extra:關于mysql如何解析查詢的額外信息。例子:using temporary和using filesort,意思mysql根本不能使用索引,結果是檢索會很慢
key_len的計算
所有的索引字段,如果沒有設置not null,則需要加一個字節。
定長字段,int占四個字節、date占三個字節、char(n)占n個字符。
對于變成字段varchar(n),則有n個字符+兩個字節。
不同的字符集,一個字符占用的字節數不同。latin1編碼的,一個字符占用一個字節,gbk編碼的,一個字符占用兩個字節,utf8編碼的,一個字符占用三個字節。
新聞熱點
疑難解答