另外一些MySQL优化措施

使用MySQL连接池提高性能

对于访问数据库来说,建立连接的代价比较昂贵,因此,我们有必要建立“连接池 ”来提高访问的性能。我们可以把连接当做对象或者设备,池中又有许多已经建立的连接,访问本来需要与数据库的连接的地方,都改为和池相连,池临时分配连接提供访问上使用,结果返回后,访问将连接交还。



减少对MySQL的访问以优化SQL语句

1)避免对同一数据做重复检索

应用中需要清楚对数据库的访问逻辑,需要对相同的表的访问,尽量集中在相同SQL访问,一次提取结果,减少对数据库的重复访问。

2)使用mysql query cache

作用:查询缓存存储SELECT查询的文本以及发送给客户端的相应结果,如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和执行查询。

适用范围:不发生数据更新的表,当表更改(包括表结构和表数据)后,查询缓存的相关条目被清空。

查询缓存的主要参数设置:

show variables like '%query_cache%'

have_query_cache表明服务器在安装使已经配置了高速缓存

query_cache_size表明缓存区的大小,单位为M

query_cache_type的变量值从0到2,0或者off表示缓存关闭,1或者on表示缓存打开,使用sql_no_cache的select除外,2或demand表示只有带sql_cache的select语句提供高速缓存。

在SHOW STATUS中,你可以监视缓存的性能:

变量
含义
Qcache_queries_in_cache
在缓存中已注册的查询数目
Qcache_inserts
被加入到缓存中的查询数目
Qcache_hits
缓存采样数数目
Qcache_lowmem_prunes
因为缺少内存而被从缓存中删除的查询数目
Qcache_not_cached
没有被缓存的查询数目(不能被缓存的,或由于QUERY_CACHE_TYPE)
Qcache_free_memory
查询缓存的空闲内存总数
Qcache_free_blocks
查询缓存中的空闲内存块的数目
Qcache_total_blocks
查询缓存中块的总数目

3)加Cache层

Cache(告诉缓存)、Memory(内存)、Hard Disk(硬盘)都是数据存取的单元,但存取速度却哟偶很大差异,呈一次递减的速度。对于CPU来说,它可以从距离自己最近的Cache告诉地存取数据,而不是从内存和硬盘以低几个数量级的速度来存取数据。而Cache中存储的数据,玩玩是CPU要反复存取的数据,有特定的机制(或和程序)来保证Cache内存的命中率(Hit Rate),因此,CPU存取数据的速度在应用高速缓存后得到了巨大的提高。


因为将数据写入高速缓存的任务由Cache Manager负责,所以对用户来说高速缓存的内容肯定是只读的。需要你做的工作很少,程序中的SQL语句和直接访问的DBMS时没有区别,返回的结果也看不出有什么区别。而数据库厂商往往会在DB Server的配置文件中提供与Cache相关的参数,通过修改它们,可针对我们的应用优化Cache的管理。


MySQL负载均衡

1)利用MySQL复制分流查询操作

利用MySQL的主从复制可以有效地分流更新和查询操作,具体的实现是一个主服务器,承担更新操作,多态从服务器,承担查询操作,主从之间通过复制实现数据的同步。多态从服务器一方面用来确保可用性,一方面可以创建不同的索引满足不同的查询需求。


对于主从之间不需要复制全表的情况,可以通过在主服务器上搭建一个虚拟从服务器,将需要复制到从服务器的表设置层blackhole引擎,然后定义replicate-do-table参数只复制这些表,这样就过滤出需要复制的binlog,减少了传输binlog的贷款。因为搭建的虚拟的从服务器只收到过滤binlog的作用,并没有实际记录任何数据,所以对主数据库服务器的性能影响也是非常有限的。


通过复制分流查询的存在的问题是主数据库上更新频繁或者网络出现问题的时候,主从之间的数据可能存在差异,造成查询结果的异议,应用在设计的时候需要有所考虑。

2)采用分布式数据库架构

MySQL从5.0.3开始支持分布式事务,当前分布式事务只对InnoDB存储引擎支持。分布式的数据库架构适合大数据量、负载高的情况,有良好的扩展性和高可用性。通过在多台服务器之间实现在多台服务器之间的负载均衡,提高了访问的执行效率。具体的实现的适合,可以使用MySQL的Cluster功能(NDB引擎)或者自己编写程序来实现全局事务。




你可能感兴趣的:(mysql)