文章目錄

key_buffer_size 索引缓冲区大小

1
2
3
4
5
6
7
SHOW STATUS LIKE 'key_read%';  
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Key_read_requests |9335458|
| Key_reads |301 |
+-------------------+-------+

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SHOW GLOBAL STATUS LIKE 'Open%tables';  
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 400 |
| Opened_tables | 24257 |
+---------------+-------+
[sql] view plaincopy
show variables like 'table%cache';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| table_definition_cache | 400 |
| table_open_cache | 400 |
+------------------------+-------+

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
11
show 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
17
show 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
show status like  'Innodb_buffer_pool_%';  
+-----------------------------------+-------+
| Variable_name | Value |
+-----------------------------------+-------+
| Innodb_buffer_pool_pages_data | 277 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 26 |
| Innodb_buffer_pool_pages_free | 234 |
| Innodb_buffer_pool_pages_misc | 1 |
| Innodb_buffer_pool_pages_total | 512 |
| Innodb_buffer_pool_read_ahead_rnd | 2 |
| Innodb_buffer_pool_read_ahead_seq | 11 |
| Innodb_buffer_pool_read_requests | 22288 |
| Innodb_buffer_pool_reads | 91 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 53 |
+-----------------------------------+-------+

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 修改客户端连接默认编码,一般来讲这个可以不设置,在客户端连接到数据库时客户端主动设置编码方式。

文章目錄