MySQL 应用优化
1、使用连接池
对于访问数据库来说,建立连接的代价比较昂贵,因此,我们有必要建立“连接池”以提高访问的性能。从名字上理解,“连接池”是一个存放“连接”的“池子”,再具体一些,我们可以把连接当作对象或者设备,统一放在一个“池子”里面,以前需要直接访问数据库的地方,现在都改为从这个“池子”里面获取连接来使用。因为“池子”中的连接都已经预先创建好,可以直接分配给应用使用,因此大大减少了创建新连接所耗费的资源。连接返回后,本次访问将连接交还给“连接池”,以供新的访问使用。
2、减少对 MySQL 的访问
2.1、避免对同一数据做重复检索
应用中需要理清对数据库的访问逻辑。能够一次连接就能够提取出所有结果的,就不用两次连接,这样可以大大减少对数据库无谓的重复访问。
2.2、使用查询缓存
MySQL 的查询缓存(MySQL Query Cache)是在 4.1 版本以后新增的功能,它的作用是存储 SELECT 查询的文本以及相应结果。如果随后收到一个相同的查询,服务器会从查询缓存中重新得到查询结果,而不再需要解析和执行查询。
查询缓存的适用对象是更新不频繁的表,当表更改(包括表结构和表数据)后,查询缓存值的相关条目被清空。
2.3、增加CACHE层
在应用中,我们可以在应用端加 CACHE 层来达到减轻数据库的负担的目的。CACHE 层有很多种,也有很多种实现的方式,只要能达到降低数据库的负担,又能满足应用就可以,这就需要根据应用的实际情况进行特殊处理。
3、负载均衡
负载均衡(Load Balance)是实际应用中使用非常普遍的一种优化方法,它的机制就是利用某种均衡算法,将固定的负载量分布到不同的服务器上,以此来减轻单台服务器的负载,达到优化的目的。负载均衡可以用在系统中的各个层面中,从前台的 Web 服务器到中间层的应用服务器,最后到数据层的数据库服务器,都可以使用。
3.1、利用 MySQL 复制分流查询操作
利用 MySQL 的主从复制可以有效地分流更新操作和查询操作,具体的实现是一个主服务器承担更新操作,而多台从服务器承担查询操作,主从之间通过复制实现数据的同步。多台从服务器一方面用来确保可用性,一方面可以创建不同的索引以满足不同查询的需要。
对于主从之间不需要复制全部表的情况,可以通过在主服务器上搭建一个虚拟的从服务器,将需要复制到从服务器的表设置成 BlackHole 引擎,然后定义 replicate-do-table 参数只复制这些表,这样就过滤出需要复制的 BINLOG,减少了传输 BINLOG 的带宽。因为搭建的虚拟从服务器只起到过滤 BINLOG 的作用,并没有实际记录任何数据,所以对主数据库服务器的性能影响也非常得有限。
3.2、采用分布式数据库架构
分布式的数据库架构适合大数据量、负载高的情况,它具有良好的扩展性和高可用性。通过在多台服务器之间分布数据,可以实现在多台服务器之间的负载平均,提高了访问的执行效率。具体实现的时候,可以使用 MySQL 的 CLUSTER 功能或者通过用户自己编写的程序来实现全局事务。需要注意的是当前分布式事务只支持 InnoDB 存储引擎,因此如果自己编写程序来实现分布式架构数据库的话,那么就必须采用 InnoDB 存储引擎。
4、其他优化措施
(一)对于没有删除行操作的 MyISAM 表,插入操作和查询操作可以并行进行,因为没有删除操作的表查询期间不会阻塞插入操作。对于确实需要执行删除操作的表,尽量在空闲时间进行批量删除操作,并且在进行删除操作之后应该进行 OPTIMIZE 操作来消除由于删除操作带来的空洞,以避免将来的更新操作阻塞其他操作。
(二)充分利用列有默认值的事实。只有当插入的值不同于默认值时,才明确地插入值。这会减少 MySQL 需要做的语法分析从而提高插入速度。
(三)表的字段尽量不使用自增长变量,在高并发情况下该字段的自增可能对效率有比较大的影响,推荐通过应用来实现字段的自增长。