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略大。

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