1.定位需要优化的地方
开启慢查询
my.ini log-slow-queries=/data;long_query_time = 5 ;log-queries-not-using-indexes
set global slow_query_log=on
查看慢查询日志 mysqldumpslow
2.使用explain(type,key),profiling(show profiles;show profile for query id)
-----------------------------------------------
配置优化
1.connections的使用率
connection_used_rate = max_used_connections/max_connections * 100%(理想85%)
如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值
show variables like ‘max_connections’ 最大连接数
show status like ‘max_used_connections’响应的连接数
2.myisam索引缓存 key_buffer_size innodb 是innodb_buffer_pool_size
指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好
show variables like ‘key_buffer_size‘;
show global status like ‘key_read%‘;
key_reads直接从硬盘读取索引的次数
key_read_requests 索引请求次数
key_cache_miss_rate =Key_reads / Key_read_requests * 100%,设置在1/1000左右较好
3.查询结果缓冲 query_cache_size
mysql将查询结果存放到缓冲区,注意对select语句是区分大小写的
show global status like 'qcache%';
show global status like 'query_cache%';
判断query_cache_size设置是否合理:
查询缓存碎片率 = qcache_free_blocks /qcache_total_blocks *100%(查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话)
查询缓存利用率 = (query_cache_size - qcache_free_memory)/query_cache_size*100%(查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多)
缓存命中率 = (qcache_hits - qcache_inserts)/qcache_hits*100%
如果Qcache_lowmem_prunes 值比较大,表示查询缓存区大小设置太小,需要增大。
如果Qcache_free_blocks 较多,表示内存碎片较多,需要清理,flush query cache
query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
MySQL查询缓存变量解释:
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:缓存中块的数量。
query_cache_limit:超过此大小的查询将不缓存
query_cache_min_res_unit:缓存块的最小大小
query_cache_size:查询缓存大小
query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache
中,是否返回cache结果还是等写操作完成再读表获取结果。
query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处
4.表缓冲 table_cache
通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败
5.临时表缓冲tmp_table_size
show global status like ‘created_tmp%‘;
缓冲区使用率= 1-Created_tmp_disk_tables / Created_tmp_tables * 100%
每次创建临时表,Created_tmp_tables增加,如果临时表大小超过tmp_table_size,则是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数
建议尽量优化查询,要确保查询过程中生成的临时表在内存中,避免临时表过大导致生成基于硬盘的MyISAM表