应用优化:
使用连接池:
- 使用数据库连接池,可以复用数据库连接对象,从而减少创建新连接带来的资源消耗。
减少对MySQL的访问:
避免对同一数据做重复检索:
- 理清应用的业务逻辑,尽量减少查询次数。
使用查询缓存:
- 有关Mysql Query Cache的参数:
mysql> SHOW VARIABLES LIKE ‘%query_cache%‘; +------------------------------+---------+ | Variable_name | Value | +------------------------------+---------+ | have_query_cache | YES | --服务器是否配置高速缓存 | query_cache_limit | 1048576 | --限制缓存单个查询结果的大小,默认1M | query_cache_min_res_unit | 4096 | --分配缓存时的最小块大小,默认4KB | query_cache_size | 1048576 | --缓存区大小,根据不同的系统会有一个最小缓存区大小 | query_cache_type | OFF | --0,关闭缓存, 1打开缓存, 2请求时使用缓存(使用SELECT SQL_CACHE) | query_cache_wlock_invalidate | OFF | --对于MyISAM表,在获取到写锁后,是否失效其他连接读缓存的请求 +------------------------------+---------+
- 查看缓存状态:
mysql> SHOW STATUS LIKE ‘%Qcache%‘; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | Qcache_free_blocks | 1 | --查询缓存中空闲的内存块 | Qcache_free_memory | 1031336 | --查询缓存的空闲内存数 | Qcache_hits | 0 | --缓存采样数数目 | Qcache_inserts | 0 | --被加入到缓存中的查询数目 | Qcache_lowmem_prunes | 0 | --因缺少缓存而被删除的查询数目 | Qcache_not_cached | 1 | --没有被缓存的查询数目(不能被缓存的,或由于QUERY_CACHE_TYPE) | Qcache_queries_in_cache | 0 | --在缓存中已注册的查询数目 | Qcache_total_blocks | 1 | --查询缓存中的块的总数目 +-------------------------+---------+
增加Cache层:
- 即在应用端做一次缓存,这时应需要注意何时失效缓存。
负载均衡:
利用MySQL复制分流查询操作:
- 利用MySQL主/从服务器实现读写分离,主服务器承担写操作,从服务器承担写操作,并且可以将需要复制表设置为BlackHole引擎,然后定义replicate-do-table参数只复制这些表。
采用分布式数据库架构:
- 具体可参考MySQL的Cluster功能,分布式事务仅支持InnoDB存储引擎。
其他优化措施:
- 对于没有删除操作的MyISAM表,INSERT和SELECT是并行的。若确实有删除操作,尽量在空闲执行批量删除操作,删除后应执行OPTIMIZE操作,消除由于删除操作带来的空洞。
- 充分利用列有默认值的事实。只有当插入值不同于默认值时,才明确得插入值,这会减少MySQL的语法分析从而提高插入速度。
- 表的字段尽量不使用自增长变量,在高并发情况下,该字段的自增可能对效率有比较大的影响,推荐通过应用来实现字段的自增长。
不吝指正。