14、应用层优化

常见问题

  1. 什么东西在消耗系统中每台主机的CPU、磁盘、网络,以及内存资源
  2. 应用真的需要所有获取到的数据吗
  3. 应用在处理本应由数据库处理的事情吗
  4. 应用执行了太多的查询吗
  5. 应用执行的查询太少吗
  6. 应用创建了没必要的Mysql连接吗
  7. 应用对一个Mysql实例创建连接的次数太多了吗
  8. 应用做了太多的垃圾查询吗
  9. 应用使用了连接池吗
  10. 应用是否使用了长连接
  11. 应用是否在不使用的时候还保持连接打开

Web服务器问题

最常见的问题是保持他的进程的存活时间过长,或者在各种不同的用途下混合使用,而不是分别对不同类型的工作进行优化。
另一个主要问题是如果开启了 Keep-Alive 设置,进程可能很长时间处于繁忙状态。当然即使没有开启 Keep-Alive ,某些进程也可能存活很久。

寻找最优并发度

每个Web服务器都有一个最佳并发度,就是说让进程处理请求尽可能快,并且不超过系统负载的最优的并发连接数。

缓存

缓存对高负载应用来说是至关重要的,一个典型的Web应用程序会提供大量的内容,直接生成这些内容的成本比采用缓存要高得多,所以采用缓存通常可以获得数量级的性能提升。
可以把缓存分成两大类:被动缓存和主动缓存。被动缓存除了存储和返回数据外不做任何事情。当从被动缓存请求一些内容时,要么可以得到结果,要么返回空。
主动缓存则会在访问命中时做一些额外工作。通常会将请求转发送给应用的其他部分来生成请求结果。

应用层以下的缓存

Mysql服务器有自己的内部缓存,但也可以构建自己的缓存和汇总表。可以对缓存定制,使得他们最有效地过滤、排序、与其他表关联,计数等。

应用层缓存

因为应用可以缓存部分计算结果,所以应用层缓存可能比更低层次的缓存更有效。所以应用层缓存可以节省两方面的工作:获取数据以及基于这些数据进行计算。
但应用层缓存也有缺点,那就是缓存命中率可能更低,并且可能使用较多的内存。
应用缓存主要有以下几种:

  1. 本地缓存
  2. 本地共享内存缓存
  3. 分布式内存缓存
  4. 磁盘上的缓存

缓存控制策略

缓存也有像反范式化数据库设计一样的问题:重复数据,也就是说有多个地方需要更新数据,所以需要想办法避免读到脏数据,下面是一些常见的缓存控制策略:

  1. TTL

缓存对象存储时设置一个过期时间,可以通过清理进程在达到过期时间后删除对象。

  1. 显示失效

如果不能接受脏数据,那么进程在更新原始数据时需要同时使缓存失效。这种策略有两个变种:写失效和写更新。写失效很简单,只需要标记缓存数据已经过期。写更新需要再更新数据时替换掉缓存项。

  1. 读时失效

在更改旧数据时,为了避免要同时失效派生出来的脏数据,可以在缓存中保存一些信息,当从缓存中读数据时可以利用这些信息判断数据是否已经失效。

缓存对象分层

分层缓存对象对检索、失效和内存利用都有帮助。可以缓存关系搜索的最小信息,而不必缓存整个列表。
缺点就是相对于一次性获取整个搜索结果,必须在缓存中检索多个对象。

你可能感兴趣的:(Mysql高性能学习,后端,面试,java,mysql,数据库)