为了减少数据库服务器的压力,提升响应速度,我们将采取数据库缓存。常用的缓存方式有内存缓存和文件缓存。我们通过访问缓存数据让客户端很少访问数据库服务器甚至不访问数据库服务器,在高并发下能最大程度的降低对数据库服务器的压力
- MySQL的查询缓存
该方式用的不太多,mysql自带。
查询缓存可以看成sql文本和查询结果的映射,如果第二次查询的sql和第一次sql完全相同,则会使用缓存
我们可以使用 show status like 'Qcache_hits'
;查看命中次数
- 如果表的结构或数据发生改变,那么查询缓存则不再生效
- 通过
Flush QUERY CACHE
来清理查询缓存碎片 - 通过
RESET QUERY CAHCE
从查询缓存中移除所有查询 - 通过
FLUSH TABLES
关闭所有打开的表,并清空查询缓存
1 | query_cache_type |
- Memcache缓存查询数据
对于大型站点,如果没有中间缓存层,当流量打入数据库层时,即便有之前的几层优化(CDN,WEB负载均衡)为我们挡住一部分流量,但是在大并发的情况下还是会有大量的请求涌入数据库,这样对数据库服务器的压力也很大,响应速度会下降,因此添加中间缓存层很有必要
Memcache是一套分布式的高速缓存系统,对于需要频繁访问数据库的网站的访问速度提升有显著效果
####工作原理:
Memcache通过在内存里维护一个统一的巨大的hash表,它能通过存储各种格式的数据,包括图像、视频、文件以及数据的检索结果等。将数据调用到内存,然后从内存中读取,大大的提升读取速度
####工作流程:
先检查客户端的请求是否在memcache中,如果有,直接返回请求数据,不再对数据库进行操作;如果没有,就去查数据库,把从数据库中得到的结果返回,并缓存一份到memcache当中
####常用方法
1 | 获取: get(key) |
- 用Redis缓存查询数据
Redis与Memcache的区别
- Redis与Memcache的性能相差不大
- Redis依赖客户端来实现分布式读写(不是特别明白)
- memcache本身没有数据冗余机制
- Redis支持快照、AOF,依赖快照进行持久化,aof增强了可靠性的同时,对性能有一定影响
- memcache不支持持久化,通常只用于做缓存
- memcache在并发场景下,用cas保证一致性,redis事务支持比较弱,只能保证事务中的每个操作连续执行
- Redis支持多种数据类型
总结:
Redis用于数据量较小的高性能操作和运算上
memcache用于在动态系统中减少数据库负载,提升性能,适合做缓存
MYSQL数据库层的优化
- 数据表数据类型的优化
- 索引优化
- SQL语句的优化
- 存储引擎的优化
- 数据表结构设计的优化
- 数据库服务器架构的优化