mysql 優化

mysql 優化(linux環境下)

方法1:添加sql日誌,定位具體查詢慢的語句

1,首先是在mysql配置文件中添加超時控制,在mysqld下面添加2s超時:

vi /etc/my.cnf

                                                        

2,重啓mysql,設置日誌顯示爲on,查看slow_query_log可以看到顯示爲on了。

3,接着執行一條時間查過2s的sql,然後查看日誌文件,可以看到如下的記錄,接下來我們可以通過日誌來進行優化了。

查看日誌文件命令:tail -f /var/lib/mysql/mysql_slow.log

方法2:建立分區表。

在實際的項目開始的時候,一般不會特意去建立分區表,當項目運行一段時間後,具體定位到數據量大的表時可以考慮分區:RANGE,LIST,HASH,KEY。在實際情況當中一般是按照時間的range進行分區,下面是實際情況當中給表添加按照月的分區的sql

alter tableWD_EnergyMeasure_His PARTITION by range(TO_DAYS(datRecTime))

(

PARTITIONp20131001 VALUES LESS THAN(TO_DAYS('2013-10-01 00:00:00')),

PARTITIONp20131101 VALUES LESS THAN(TO_DAYS('2013-11-01 00:00:00')),

PARTITIONp20131201 VALUES LESS THAN(TO_DAYS('2013-12-01 00:00:00')),

PARTITIONp20140101 VALUES LESS THAN(TO_DAYS('2014-1-01 00:00:00')),

PARTITIONp20140201 VALUES LESS THAN(TO_DAYS('2014-2-01 00:00:00')),

PARTITIONp20140301 VALUES LESS THAN(TO_DAYS('2014-3-01 00:00:00')),

PARTITIONp20140401 VALUES LESS THAN(TO_DAYS('2014-4-01 00:00:00')),

PARTITIONp20140501 VALUES LESS THAN(TO_DAYS('2014-5-01 00:00:00')),

PARTITION p20140601VALUES LESS THAN(TO_DAYS('2014-6-01 00:00:00')),

PARTITIONp20140701 VALUES LESS THAN(TO_DAYS('2014-7-01 00:00:00')),

PARTITIONp20140801 VALUES LESS THAN(TO_DAYS('2014-8-01 00:00:00')),

PARTITIONp20140901 VALUES LESS THAN(TO_DAYS('2014-9-01 00:00:00')),

PARTITIONp20141001 VALUES LESS THAN(TO_DAYS('2014-10-01 00:00:00')),

PARTITIONp20141101 VALUES LESS THAN(TO_DAYS('2014-11-01 00:00:00')),

PARTITIONp20141201 VALUES LESS THAN(TO_DAYS('2014-12-01 00:00:00'))

);

方法3:建立索引。

建立索引一般是老生常談的技術,主鍵一般是索引,我們也可以在經常使用的字段上建立聯合索引。

方法4:建立主從分區數據庫

主數據庫用於數據的插入刪除修改等操作,從數據庫主要用於數據的查詢操作,這樣可以避免在對數據進行大量修改的時候遇到比較耗時的查詢導致卡死的問題。主從數據庫的建立以及數據庫備份的方法其他幾篇文章當中都也涉及。

方法5:調整數據庫參數配置

 參數1:key_buffer_size,不超過內存的1/4,Key_reads/Key_read_requests>0.01時儘量把key_buffer_size設置大一點(默認8M)

測試例子1:
key_buffer_size:12M
時間:10.21

運行帶索引的查詢
mysql> show global status like 'key_read%';
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| Key_read_requests | 4359752 |
| Key_reads         | 626445  |
+-------------------+---------+
2 rows in set (0.00 sec)

再次運行該查詢
mysql> show global status like 'key_read%';
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| Key_read_requests | 6539628 |
| Key_reads         | 939665  |
+-------------------+---------+

測試例子2:
key_buffer_size:384M
時間:9.62s

運行帶索引的查詢
mysql> show global status like 'key_read%';
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| Key_read_requests | 2179876 |
| Key_reads         | 313221  |
+-------------------+---------+
2 rows in set (0.00 sec)

再次運行該查詢
mysql> show global status like 'key_read%';
+-------------------+---------+
| Variable_name     | Value   |
+-------------------+---------+
| Key_read_requests | 4359752 |
| Key_reads         | 313221  |
+-------------------+---------+
2 rows in set (0.00 sec)

參數2:thread_cache_size,進程緩存數,客戶端進程的創建會有一定的開銷,當客戶端斷開之後,服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷燬(前提是緩存數未達上限)。

測試例子:下面的測試例子中可以看到,在thread_cache_size=0時,Thread_created在不斷地增大,但是設置thread_cache_size=64後可以看到在打開關閉客戶端的過程中,Thread_created沒有變化,但是Thread_cached在變化。

測試例子1:thread_cache_size=0

mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 6     |
| Threads_created   | 8     |
| Threads_running   | 3     |
+-------------------+-------+
4 rows in set (0.00 sec)


mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 10    |
| Threads_created   | 12    |
| Threads_running   | 3     |
+-------------------+-------+
4 rows in set (0.00 sec)


mysql> show variables like 'thread_cache_size';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 0     |
+-------------------+-------+
1 row in set (0.01 sec)


mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 10    |
| Threads_created   | 12    |
| Threads_running   | 3     |
+-------------------+-------+
4 rows in set (0.00 sec)

測試例子2:thread_cache_size=64

mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 3     |
| Threads_connected | 3     |
| Threads_created   | 5     |
| Threads_running   | 3     |
+-------------------+-------+
4 rows in set (0.00 sec)


mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 1     |
| Threads_connected | 5     |
| Threads_created   | 5     |
| Threads_running   | 3     |
+-------------------+-------+
4 rows in set (0.00 sec)


mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 3     |
| Threads_connected | 3     |
| Threads_created   | 5     |
| Threads_running   | 3     |
+-------------------+-------+
4 rows in set (0.00 sec)

參數4:table_open_cache

一般來說,可以在phpmyadmin中查看Open_tables與Opened_tables的值,也可以執行

mysql> show global status like 'open%_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 63    |
| Opened_tables | 71    |
+---------------+-------+
2 rows in set (0.00 sec)

來查看這兩個參數的值。其中Open_tables是當前正在打開表的數量,Opened_tables是所有已經打開表的數量。

如果Open_tables的值已經接近table_cache的值,且Opened_tables還在不斷變大,則說明mysql正在將緩存的表釋放以容納新的表,此時可能需要加大table_cache的值。對於大多數情況,

比較適合的值:

Open_tables / Opened_tables >= 0.85
Open_tables / table_cache <= 0.95

如果對此參數的把握不是很準,VPS管理百科給出一個很保守的設置建議:把MySQL數據庫放在生產環境中試運行一段時間,然後把參數的值調整得比Opened_tables的數值大一些,並且保證在比較高負載的極端條件下依然比Opened_tables略大。

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