1.使用连接池 a.把连接当做对象或设备,统一放在‘连接池’里。凡是需要访问数据库的地方都从连接池里取连接 2.减少对mysql的访问: a.避免对同一数据做重复检索 b.使用查询缓存 1)have_query_cache:表明服务器在安装时是否已经配置了高速缓存 2)query_cache_size:表明缓存区大小 3)query_cache_type:0/off = 缓存关闭,1/on = 缓存打开(使用sql_no_cache的select除外),2/demand(只有带sql_cache的select语句提供高速缓存 3.使用show status命令,监视查询缓存使用: a.qcache_queries_in_cache:在缓存中已注册的查询数目 b.qcache_inserts:被加入到缓存中的查询数目 c.qcache_his:缓存采样数目 d.qcache_lowmem_prunes:因为缺少内存而被从缓存中删除的查询数目 e.qcache_not_cached:没有被缓存的查询数目 f.qcache_free_memory:查询缓存的空间内存总数 g.qcache_free_blocks:查询缓存的空闲内存块数目 h.qcache_total_blocks:查询缓存的块的总数目 4.增加cache层: a.将部分数据从数据库抽取出来存成文件 b.建立二级数据库 5.负载均衡: a.采取mysql复制分流查询操作 b.采取分布式数据库架构,具体可以用mysql的cluster功能,但必须采用innod存储引擎 6.其他优化方案: a.对于没有删除行操作的myisam表,插入操作可以和查询操作并行进行。因为不会出现阻塞。如果一定要删除,可以在空闲时间删除。并且在删除之后进行optimize操作 b.充分利用列有默认值,只有插入的值不同于默认值时才‘明确’插入值,这样可以提高插入速度 c.表的字段尽可能不使用自增长变量,因为在高并发情况下自增长可能对效率有影响 二、实践: mysql> use sakila; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed 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 | 0 | | query_cache_type | OFF | | query_cache_wlock_invalidate | OFF | +------------------------------+---------+ 6 rows in set (0.00 sec) |