当前位置:首页 > 知道中心 > MYSQL > 文章

MYSQL的主要参数设置(优化)

发表于:2013-09-01| 次阅读| 作者:藕码网
TAG: MYSQL
摘要:MYSQL的主要参数设置(优化)

1、 key_buffer_size(针对myisam

是指定索引缓冲区的大小,决定了索引处理的速度。对于mysql5.0这个变量最大的上限是4GB。但是如果是mysql5.1以上的版本则允许更大的值。通过创建多个缓冲区,可以一次在内存中保存4G以上的索引。例如:在配置文件my.ini中加上:

key_buffer _size = 4G

key_buffer_1.key_buffer_size = 1G

key_buffer_2.key_buffer_size = 1G

现在就可以有3个缓冲区了,可以通过cache  index命令来将表映射到缓存中。例如将表t1t2索引保存到key_buffer_1;

mysql> cache index t1,t2 in key_buffer_1;

还可以用load index将表的索引预先加载到缓存中;

mysql> load index into cache t1,t2;

key_buffer_size这个参数可以根据show statusshow variables查看的使用情况和性能设置。可以先使用默认的设置,在通过计算缓存命中率和缓存使用百分比来考虑是否需要调整。缓存命中率的计算公式:100-((key_reads*100)/key_read_requests)

其中的key_readskey_read_requests可以通过show status来查看,例如:

mysql> show status like 'key_read%';

+-------------------+----------+

| Variable_name     | Value    |

+-------------------+----------+

| Key_read_requests | 27455182 |

| Key_reads         | 680745   |

+-------------------+----------+

2 rows in set (0.00 sec)

key_reads表示从硬盘中读取的次数,也就是在缓存中没有读到的请求次数

key_read_requests表示总共有多少次索引请求

上面的例子中我们可以计算出缓存命中率约是99.98%,可以表明key_buffer_size设置是足够的。

缓存使用百分比的计算公式:

100-((key_blocks_unused*key_cache_block_size)*100/key_buffer_size)

其中的参数也是通过show status来查看的,例如:

mysql> show status like 'key_blocks_u%'; 

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| Key_blocks_unused | 14219 |

| Key_blocks_used   | 14347 |

+-------------------+-------+

2 rows in set (0.00 sec)

Mysql> show variables like 'key_cache_block_size';

+----------------------+-------+

| Variable_name        | Value |

+----------------------+-------+

| key_cache_block_size | 1024  |

+----------------------+-------+

1 row in set (0.00 sec)

Key_blocks_unused表示未使用的缓存簇(blocks)数

Key_blocks_used表示表示曾经用到的最大的blocks数

key_cache_block_size表示索引缓冲区块的大小,单位是字节

上面的例子我们可以计算出内存使用率是23%

注解:查看缓存命中率是可以作为调整key_buffer_size参数的参考,但是这个命中率也有局限性,就是没有考虑到时间的问题。所以还可以通过计算每秒未命中的次数作为设置key_buffer_size的参考。

计算公式:key_read/uptime

Uptime就是mysql运行的时间,例如:

mysql> show status like 'uptime'

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Uptime        | 2219  |

+---------------+-------+

1 row in set (0.00 sec)

mysql> show status like 'key_read%';

+-------------------+----------+

| Variable_name     | Value    |

+-------------------+----------+

| Key_read_requests | 10471296 |

| Key_reads         | 44438    |

+-------------------+----------+

2 rows in set (0.00 sec)

从上面的信息可以计算出每秒未命中的次数是20/秒。


2、 query_cache(查询缓存)

Mysql的查询缓存保留了查询的表和查询返回客户端的完整结果。当缓存命中的时候,服务器马上返回保存的结果,跳过解析、优化和执行的步骤。如果表发生了改变,那么缓存就失效了。

查询缓存的参数:

mysql> show variables like '%query_cache%';

+------------------------------+----------+

| Variable_name                | Value    |

+------------------------------+----------+

| have_query_cache             | YES      |

| query_cache_limit            | 1048576  |

| query_cache_min_res_unit     | 4096     |

| query_cache_size             | 16777216 |

| query_cache_type             | ON       |

| query_cache_wlock_invalidate | OFF      |

+------------------------------+----------+

5 rows in set (0.00 sec)

have_query_cache 当前的版本是否支持查询缓存

query_cache_limit 可缓存具体查询结果的最大值(sql_no_cache)

query_cache_min_res_unit 缓存块的最小单位

query_cache_size 查询缓存大小(须是1024的倍数)

query_cache_type 允许缓存(0或OFF将阻止缓存或查询缓存结果)

query_cache_wlock_invalidate 可以让你从其他联接已经锁定了的表中读取缓存 过的数据

查询缓存的使用状态:

mysql> show global status like 'qcache%';

+-------------------------+---------+

| Variable_name           | Value   |

+-------------------------+---------+

| Qcache_free_blocks      | 1249    |

| Qcache_free_memory      | 3269080 |

| Qcache_hits             | 110198  |

| Qcache_inserts          | 115990  |

| Qcache_lowmem_prunes    | 81077   |

| Qcache_not_cached       | 7521    |

| Qcache_queries_in_cache | 3783    |

| Qcache_total_blocks     | 10877   |

+-------------------------+---------+

8 rows in set (0.00 sec)

Qcache_free_blocks 缓存中相邻内存块的个数数目大说明可能有碎片。FLUSH QUERY  CACHE会对缓存中碎片的进行整理,从而得到一个空闲块。

Qcache_free_memory 缓存中的空闲内存。

Qcache_hits 每次查询在缓存中命中时就增大

Qcache_inserts 每次插入一个查询时增大

Qcache_lowmem_prunes 缓存出现内存不足并且必须要进行清理以便为更多查询提供空  间的次数。这个数字最好长时间来看;如果这个数字在不断增长, 就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks free_memory可以告诉您属于哪种情况) 

Qcache_not_cached 不适合进行缓存的查询的数量,通常是由于这些查询不     SELECT 语句。例如now()之类的函数。

Qcache_queries_in_cache 当前缓存的查询(和响应)的数量。

Qcache_total_blocks 缓存中块的数量

查询缓存命中率计算公式:Qcache_hits/(Qcache_hits + com_select),其中com_select可以通过show global status like 'com_select'查到。

查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%

查询缓存利用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100%



3 table_cache

table_cache参数是设置表高速缓存的数目,好处就是可以快速的访问表中的内容。每一个连接进来,至少需要打开一个表的缓存,因此这个参数大小和max_connections设置有关。具体的关系是:tables_cache=max_connections*N ,其中N应用可以执行的查询的一个接中表的最大数量。当然这个是极端的情况,一般不需要设置那么高,可以根据查看opened_tables这个参数来考虑是否调整table_cache的值。例如:

mysql> show global status like 'open%tables';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Open_tables   | 256   |

| Opened_tables | 46824 |

+---------------+-------+

2 rows in set (0.00 sec)

Open_tables表示表示打开表的数量Opened_tables表示打开过表的数量。如果Opend_tables数值很大且在不停的增加,则说明table_cache的值设置了太小。从上面的例子中,可以看出table_cache值设置的太小了,可以考虑设置的大点。(可以用flush tables来清空缓存)




4 thread_cache_size

thread_cache_size是设置能在缓存中保留线程的数量。作用是将空闲的连接线程放在连接池中,而不是立即销毁.这样的好处就是,当又有一个新的请求的时候,mysql不会立即去创建连接线程,而是先去Thread_Cache中去查找空闲的连接线程,如果存在则直接使用,不存在才创建新的连接线程.

mysql> show global status like 'thread%';

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| Threads_cached    | 5     |

| Threads_connected | 14    |

| Threads_created   | 85    |

| Threads_running   | 1     |

+-------------------+-------+

4 rows in set (0.00 sec)

Threads_created 曾经打开过的最大线程数

Threads_connected 当前打开的连接数

Threads_running 当前运行的

thread_cache_size设置主要查看Threads_created这个值的变化,如果Threads_created参数值很大,而且在不停的增加则表明服务器在一直创建线程,可以考虑调整thread_cache_size的大小。




5、 mysql的慢查询

通过设置参数slow_launch_time的大小来记录有多少慢查询记录。

mysql> show variables like '%slow%';

+------------------+-------+

| Variable_name    | Value |

+------------------+-------+

| log_slow_queries | OFF   |

| slow_launch_time | 2     |

+------------------+-------+

2 rows in set (0.00 sec)

log_slow_queries 是否开启日志

slow_launch_time 慢创建线程的时间

mysql> show variables like 'long_query_time';

+-----------------+-------+

| Variable_name   | Value |

+-----------------+-------+

| long_query_time | 10    |

+-----------------+-------+

1 row in set (0.00 sec)

long_query_time 慢查询时间

mysql> show global status like '%slow%';

+---------------------+-------+

| Variable_name       | Value |

+---------------------+-------+

| Slow_launch_threads | 0     |

| Slow_queries        | 5     |

+---------------------+-------+

2 rows in set (0.00 sec)

Slow_launch_threads   创建时间超过slow_launch_time秒的线程数

Slow_queries          查询时间超过long_query_time秒的查询的个数



注:本站部分信息可能源于互联网分享,如有侵权,请告知,我们将及时删除!