1.查看是否開啓慢查詢日誌 show variables like 'slow_query_log'
2.設置沒有索引的記錄到慢查詢日誌 set global log_queries_not_using_indexes=on
3.查看超過多長時間的sql進行記錄到慢查詢日誌 show variables like 'long_query_time'
4.設置慢查詢的時間 set long_query_time=1
5.windows環境下能夠直接修改my.ini文件。設置超時記錄慢查詢時間修改後須要重啓數據庫生效。mysql
兩款mysql慢查詢日誌分析工具,一款是MySQL自帶的mysqldumpslow,另外一款是pt-query-digest;推薦使用pt-query-digest,分析日誌更具體。
經過pt-query-digest日誌發現有問題的sql:
1.查詢次數多且每次佔用查詢時間長的sql。經過日誌的前幾個查詢linux
如圖查詢了1次,佔用73%的時間。
2.IO大的SQL。數據庫主要瓶頸是IO,對IO進行優化,能夠有效提升數據庫的效率。經過日誌能夠分析Rows examine項,掃描行數的多少,掃描越多,IO消耗越大。
3.未命中索引的sql。經過分析日誌的Rows examine與Rows sent的比,比值越大,說明掃描的行數多,發送數據行數少,沒有使用索引,而進行表的掃描。sql
使用expain查詢sql的執行計劃,explain返回各列的含義
table:顯示這一行的數據是關於哪張表的
type:這是重要的列,顯示鏈接使用了何種類型。從最好到最差的鏈接類型爲const、eq_reg、ref、range、index和ALL
possible_keys:顯示可能應用在這張表中的索引。若是爲空,沒有可能的索引。
key:實際使用的索引。若是爲NULL,則沒有使用索引。
key_len:使用的索引的長度。在不損失精確性的狀況下,長度越短越好。
ref:顯示索引的哪一列被使用了,若是可能的話,是一個常數
rows:MYSQL認爲必須檢查的用來返回請求數據的行數
extra列須要注意的返回值
Using filesort:看到這個的時候,查詢就須要優化了。MYSQL須要進行額外的步驟來發現如何對返回的行排序。它根據鏈接類型以及存儲排序鍵值和匹配條件的所有行的行指針來排序所有行
Using temporary:看到這個的時候,查詢須要優化了。這裏,MYSQL徐喲建立一個臨時表來存儲接口,這一般發生在對不一樣的列表進行ORDER BY上,而不是GROUP BY上數據庫
1.在使用max()函數時,能夠給查詢列,加上索引。
2.count(字段)不會將,字段值爲null,算到計數內,count(*)會算在內。
count()用法解釋,count會把()內不爲空Null的值計算在內,好比:windows
CREATE TABLE test ( `value` int(11) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO test (value) VALUES(1); INSERT INTO test (value) VALUES(4); INSERT INTO test (value) VALUES(5); INSERT INTO test (value) VALUES(6); INSERT INTO test (value) VALUES(4); INSERT INTO test (value) VALUES(4); INSERT INTO test (value) VALUES(5); INSERT INTO test (value) VALUES(2); INSERT INTO test (value) VALUES(8); INSERT INTO test (value) VALUES(1);
SELECT COUNT(value=4) FROM test;結果爲10,是錯誤的。
SELECT COUNT(value=4 OR NULL) FROM test;結果爲3,是正確的。安全
由於當value不等於4的時候,括號內的結果爲false,mysql看做是0,並不是Null,因此仍然算在計數內。經過下面簡單可知服務器
SELECT 4=4, 3=4, 1 or null, 0 or null
結果爲 1 | 0 | 1 | NULL
只有當value=4爲false的時候,or null,括號內的值才爲Null,纔不會計算在內,獲得正確答案。否則value等於任何值,答案都是10.網絡
3.對limit進行優化,能夠在不影響結果的狀況下,對帶有索引列進行排序,好比主鍵排序。tcp
1.在where從句,group by從句,order by 從句,on從句中出現的列創建索引。
2.索引字段越小越好,由於是分頁進行存儲的,字段越小,一頁中索引會包含越多,一次IO操做獲取的數據量就越大。
3.離散度大的列放到聯合索引的前面。
例如,select count(distinct id),count(distinct real_name) from user;
id 是惟一值,因此離散度更高。而 real_name 會出現重複—>會有同名同姓的狀況,因此離散度低。因此創建聯合索引index(id,real_name)。
4.查找重複及冗餘索引函數
select a.TABLE_SCHEMA AS '數據名', a.TABLE_NAME AS '表名', a.INDEX_NAME AS '索引1', b.INDEX_NAME AS '索引2', a.COLUMN_NAME as '重複列名' from STATISTICS a JOIN STATISTICS b ON a.TABLE_SCHEMA = b.TABLE_SCHEMA AND a.TABLE_NAME = b.TABLE_NAME AND a.SEQ_IN_INDEX = b.SEQ_IN_INDEX AND a.COLUMN_NAME = b.COLUMN_NAME
5.dt-duplicate-key-checker 索引檢索分析工具。
pt-duplicate-key-checker -uroot -p'ROOT' -h 127.0.0.1
選擇合適的數據類型
1.使用能夠存下你數據的最小數據類型
2.使用簡單的數據類型,Int要比varchar類型在mysql的處理上簡單
3.儘量的使用not null定義字段
4.儘可能少用text類型,非用不可時候最好考慮分表。
一、時間轉時間戳:unix_timestamp("2016-08-01 13:14:00"); 二、時間戳轉時間:fromm_unixtime(1508076155) 三、INET_ATON()--ip地址轉換成整型 四、INET_NTOA()--整型轉換成ip地址
數據庫是基於操做系統的,目前大多數的MySQL都是安裝在linux系統之上,
因此對於操做系統的一些參數配置也影響到MySQL的性能,下面就列出一些經常使用到
的系統配置。
網絡方面的配置,要修改/etc/sysctl.conf文件
增長tcp支持的隊列書
net.ipv4.tcp_max_syn_backlog=65535
減小斷開鏈接時,資源的回收
net.ipv4.tcp_max_tw_buckets=8000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=10
打開文件數的限制,可使用ulimit -a 查看目錄的各位閒置,能夠修改
/etc/security/limits.conf文件,增長如下內容以修改打開文件數量的限制
*soft nofile 65535
*hard nofile 65535
除此以外最好在MySQL服務器上關閉iptables,selinux等防火牆軟件。
MySQL能夠經過啓動時指定配置參數和使用配置文件兩種方法進行配置,在大多數狀況下
配置文件位於/etc/my.cnf或/etc/mysql/my.cnf;在windows系統配置文件能夠位於
C:/windows/my.ini文件,MySQL查找配置的順序能夠經過如下方法得到:
$:/usr/sbin/mysqld --verbose --help | grep -A 1 'Default options'
注意:若是存在多個位置存在配置文件,則後面的會覆蓋前面的
經常使用參數說明
innodb_buffer_pool_size
很是重要的參數,用於配置innodb的緩衝池若是數據庫中只有innodb表,
則推薦配置量爲總內存的75%
下面是檢測語句
select engine,round(sum(data_ength + index_length)/1024/1024,1) as 'Total MB',
from information_schema.tables where table_schema not in ('information_schema',
'performance_schema') group by engine;
innodb_buffer_pool_size >= Total MB
innodb_buffer_pool_instances
MySQL5.5中新增參數,能夠控制緩衝池的個數,默認狀況下只有一個
innodb_log_buffer_size
innodb log緩衝的大小,因爲日誌最長每秒鐘就會刷新因此通常不用太大
innodb_flush_log_at_trx_commit
關鍵參數,對innodb的IO效率影響比較大,默認值爲1,能夠取0,1,2三個值,
通常建議設爲2,但若是數據安全性要求比較高則使用默認值1.
innodb_read_io_threads
innodb_write_io_threads
以上兩個參數決定了innodb讀寫IO進程數,默認4
innodb_file_per_table
關鍵參數,控制innodb中每個表使用獨立的表空間,默認爲OFF,也就是全部表
都會創建在共享表空間。
innodb_stats_on_metadata
決定了MySQL在什麼狀況下會刷新innodb表的統計信息
mysql第三方配置工具:
https://tools.percona.com/wizard