Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76180
  • 博文数量: 19
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-07 10:00
个人简介

迷糊

文章分类

全部博文(19)

文章存档

2021年(2)

2018年(3)

2016年(2)

2015年(12)

我的朋友

分类: Mysql/postgreSQL

2015-08-10 11:46:37

       服务器负载方面的优化(高性能mysql总结)

服务器负载方面优化包括内存,IOCPU,属于操作系统和硬件方面。

服务器负载优化的目标是低延时(时间查询快),高吞吐(并发执行查询)。

CPU:目前mysql每个查询只能使用一个CPU,因此,并发查询时无法扩展cpu的数量。数据库并发的问题有两类:逻辑并发和内部并发。逻辑并发是指应用程序的资源争用,例如锁。内部并发是指 信号量,InnoDB缓冲池页面的资源争用等。

内存:关于内存,主要需要考虑以下几方面:内存的上下限,内存大小,每个连接mysql需要使用多少内存。绑定变量和InnoDB数据字典,使用大的临时表或者复杂存储过程的查询也可能消耗内存。可以通过查看虚拟内存LinuxtopVIRTPS名利的VSZ列。Mysql比较重要的缓存如下:

 a.InnoDB缓冲池

b.InnoDB日志文件和MyISAM数据的操作系统缓存

c.MyISAM键缓存

d.查询缓存

e.无法手工配置的缓存,二进制日志和表定义文件的操作系统缓存。

a.InnoDB缓冲池:缓存索引,行的数据,锁,插入缓存和自适应哈希索引。关闭InnoDB,修改innodb_max_dirty_pages_pct变量小。监控InnodbInnodb_buffer_pool_pages_dirty和show engine innodb status;来观察脏页的刷新量。

c.MyISAM键缓存

  MyISAM只缓存索引,不缓存数据。

配置参数:

1.       key_buffer_size 大小参照索引存储占用的空间:

select sum(index_length) from information_schema.tables where engine=’MYISAM’;

2.       设置多个键缓冲方法:

A.在配置文件中设置

key_buffer_1.key_buffer_size=*G

key_buffer_2.key_buffer_size=*G

               B.使用cache_index将表映射到缓冲区

                    Cache_index table1,table2 in key_buffer_1;

               C.把表的索引载入缓存中

                 Load index into cache table1,table2.

3.       监控键缓存的方法:

Show status /show variables

4.       计算缓冲区的使用率

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

           5.键缓存块大小: key_block_size,通过create index语句的Key_block_size指定

d.查询缓存:mysql查询缓存保存查询返回的完整结果。缓存命中的问题,任何字符上的不一致都会导致缓存不命中,或者不确定的数据,例如now(),current_data()current_user或者connection_ID.查询中包含任何自定义的函数,系统函数,临时表,系统变量,系统表都不会缓存。Mysql先申请query_cache_min_res_unit的空间,然后锁住空间块,找一个校的数据开存储结果。如果还有剩余,则释放后放入空闲内存部分。查询缓存的是否有效的指标命中率和是否提升性能。未命中缓存是指没有从查询缓存中返回数据,内存不足,缓存碎片和数据修改都是造成查询缓存的原因。

查询缓存只能在会话级别进行,在数据库或者表级别不要控制查询缓存。

解决方法:1.通过参数Com_*来查看数据修改情况。2.通过qcache_lowmem_prunes来查看多少次失效是内存不足导致的。

查询缓存参数:

1.       query_cache_type (OFF,ON,DEMAND),是否打开。demand是指只有在查询语句中明确写明sql_cache的语句才放入查询缓存。

2.       query_cache_size查询缓存使用的总内存空间,字节(设置时1024整数倍)。值=0,代表关闭查询缓存。

3.       query_cache_min_res_unit 分配内存块时的最小单位。

4.       query_cache_limit 能够缓存的最大查询结果。如果结果超过此大小,那么不缓存,并返回Qcache_not_catched标志。处理方法,在查询中加入SQL_NO_CACHE

5.       query_cache_wlock_invalidate,如果锁住,是否仍然从缓存中返回结果。默认OFF

减少碎片的方法:

1.       选择合适的query_cache_min_res_unit

2.       设置单个查询最合适大小:(query_cache_size-Qcache_free_memory)除以Qcache_queries_in_cache.

3.       观察Qcache_free_blocks的空闲块多少。 Qcache_total_blocksQcache_free_block的比例不能超过50%

4.       Flush query cache完成碎片整理。使查询缓存重新排序

5.       Reset query cache 清空缓存。

查询缓存内存空间小,删除老的缓存结果。增加状态值Qcache_lowmem_prunes的值

e.线程缓存: thread_cache_size指定了可以缓存的线程数。

            Thread_connected

            Thread_created 观察线程缓存是否足够大

表缓存:存储的对象是表。Opened_tables很大,表缓存不够,增加table_cache系统变量。Open_files_limit允许打开文件数量。

阅读(965) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~