mysql优化
更新日期:
key_buffer_size 索引缓冲区大小
1 | SHOW STATUS LIKE 'key_read%'; |
Key_reads是从硬盘上读取索引的次数,Key_read_requests是索引请求次数,Key_reads/Key_read_requests即索引失效率,此值越低越好,小于1/1000较好,可以通过调整key_buffer_size的值来调整索引的利用率,可以通过show variables like ‘key_buffer_size’;查看当前值,可以修改my.cnf文件添加key_buffer_size=32M来改变大小,此值也不是越大越好,太大会增加换页率反而降低效率。另,此值只对MyISAM表有效。
table_open_cache 表缓存
1 | SHOW GLOBAL STATUS LIKE 'Open%tables'; |
Open_tables是当前打开表的数量,Opened_tables是没有在缓存中找到的表数量,table_open_cache是缓存中表的最大数量,如果Open_tables=table_open_cache,而且Opened_tables在不断增加的时候就要增大table_open_cache的值了,通过修改/etc/my.cnf,添加table_open_cache = 1024来改变大小。该值与Connections有关,因为一般而言每个线程会独立打开一个表,手册建议table_open_cache = max_connections * n,n是sql语句中的最大表数。
索引1
2
3
4
5
6
7
8
9
10
11show status like 'handler_read_%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Handler_read_first | 0 |
| Handler_read_key | 444 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 56 |
| Handler_read_rnd_next | 982 |
+-----------------------+-------+
前面4个参数都是对索引的读取次数,越大越好,后面2个参数是对数据文件读取的次数,如果Handler_read_rnd或Handler_read_rnd_next过大证明索引没有利用上,要优化sql语句,添加索引或者提高索引利用率。
thread_cache_size 线程缓存1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17show global status like 'Thread%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 0 |
| Threads_connected | 22 |
| Threads_created | 3233 |
| Threads_running | 1 |
+-------------------+-------+
[sql] view plaincopy
show status like '%connections%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Connections | 3234 |
| Max_used_connections | 25 |
+----------------------+-------+
thread cache命中率为(Connections-Threads_created)/Connections,命中率当然越高越好,上面因为thread_cache_size=0,所以每有一个连接便重新建立了一个线程,可以修改my.cnf文件添加thread_cache_size=8来改变该值。如果是长连接thread_cache_size的值就不需要设置多大,因为长连接一旦连接就不会断开重新连接也就不需要重新创建线程,短连接要根据情况设置改值大小,和连接数、内存相关(1G8个,或者参考Threads_connected值)。
innodb_buffer_pool_size innodb缓存
1 | show status like 'Innodb_buffer_pool_%'; |
innodb buffer缓存innodb表的索引、数据、插入数据时的缓冲等,读取命中率=(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%,通常要大于99%比较好,可以修改my.cnf文件添加innodb_buffer_pool_size=1G来改变该值,参考值=内存*70%~80%。
如果确定不了参数可以先用mysql提供的参考配置试试,在usr/share/mysql/目录下的my-small.cnf my-medium.cnf my-large.cnf my-huge.cnf my-innodb-heavy-4G.cnf这几个文件。
另,最好把mysql字符集设置成utf-8,兼容性更好,可避免中文乱码,在/etc/my.cnf 文件中的 [mysqld]下添加default-character-set=utf8 修改服务器编码,[client] 下添加default-character-set=utf8 修改客户端连接默认编码,一般来讲这个可以不设置,在客户端连接到数据库时客户端主动设置编码方式。