`

mysql数据库优化方案

 
阅读更多


1.1 数据冗余

数据冗余大致分为两种:

  1. 数据库冗余。是指为了防止数据丢失,或者为了提高数据库性能而对整个数据库进行备份操作,这样可以防止其中一台数据库崩溃时系统平台也崩溃的情况。
  2. 数据表字段冗余。是指在设计数据库时,某一字段数据一个表,但它又同时出现在另外一张表或者多个表中,并且和它在本来所属表中的意义相同,那么这个字段就是一个冗余字段。

这里讨论的数据冗余主要是指第二种,即数据库表字段冗余。

在进行关系数据库设计的时候,有两种选择:

  1. 尽量遵循范式理论的规约,尽可能减少冗余字段,可以让数据库设计看起来精致、优美
  2. 合理的加入冗余字段,减少join,让数据库执行性能更快。

选择第一种方案,所牺牲的性能可以通过增加服务器,构建数据库集群,进行读写分离,架设缓存等其他方法来弥补。

但是数据冗余也有一些缺点,比如给维护带来很大的麻烦,经常更新数据的时候,为了保持数据的一致性,要在业务逻辑里重复编写很多代码。

1.2 读写分离

数据分离是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效减轻数据库的压力,也能减轻IO压力,主数据库提供写操作,从数据库提供读操作,当主数据库进行写操作时,数据要同步到从数据库,这样才能有效保证数据库完整性。Mysql有自己的同步数据技术。可以通过二进制日志来复制数据。通过日志从数据库重复主数据库的操作达到复制数据目的。Mysql提供了mysql-proxy实现读写分离操作。

图2.1 mysql读写分离结构图

1.3 数据切分

数据切分是指将一台数据库上的数据分散到多台数据库服务器上,因为使用多台服务器,所以在分担数据库负载压力的同时,还能提高系统的总体可用性。

数据切分又分为两种:垂直切分和水平切分。

1.3.1垂直切分

垂直切分就是按照系统功能模块,将每个模块访问的数据表切分到不同的数据库当中,这种切分方法适用于各模块耦合度较小的系统。使用这种方法的优缺点主要有:

优点:数据库切分规则明确;容易整合;数据维护方便等。

缺点:无法在数据库内实现表连接,只能在程序中实现,并且对访问量大而且数据超大的数据库表仍然存在性能问题;事物处理变得复杂,跨服务器的分布式事物增多;并且会照成维护困难、无法扩展等问题。

1.3.2水平切分

水平切分主要是对数据量超大的表,按照其中数据的逻辑关系,根据某个字段的某种规则,将其中的数据切分到多个数据库上。水平切分主要是适用于具有超大数据量的表且有合适的字段和规则进行水平切分的数据库。它的优缺点主要是:

优点:可以在数据库中实现表连接,不会存在超大数据量且超高负载的数据表;可以再数据库内实现事物处理,事物处理相对简单;在合理的切分规则下,扩展性较好。

缺点:切分规则比较复杂,数据的维护难度增加,人工定位数据难度增加;系统模块耦合度较高,数据迁移拆分难度增加。

所以在进行数据切分的时候,应该综合考虑垂直切分和水平切分相结合的方式,对于合适的模块进行垂直切分,当模块细化到一定程度后,这是对于个别大数据量的表进行水平的切分这样可以综合两种切分方式的优点,将数据库达到最好的优化。

1.4 全文检索

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,知名该词在文章中出现的次数和位置,在应用数据库当中,可以使用lucene来对字段进行模糊匹配,可以比在数据库当中使用like获得更高的效率。

使用hibernate search,可以对目标数据库当中的庞大字段建立全文索引,然后对这些字段进行全文检索后获得相应的POJO,从而加快了对内容庞大字段进行模糊检索的速度。

1.5 高速缓存

缓存是任何海量web应用程序不可或缺的部分,Memcached是一个高性能的分布式内存对象缓存系统,用以减轻动态web应用的数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而 提高动态数据库驱动网站的访问速度。

Memcached是基于一个存储键值对的hashmap,需要采用不同的方式来执行数据库的读取和写入操作。执行读取操作的顺序是从web层获取请求并检查之前在缓存中存储的查询结果。如果找到所需的值,则返回它。如果未找到,则执行查询并将结果存储在缓存中,然后再将结果返回到web层。在执行写入操作时,首先执行数据库写入操作,然后将之前缓存的任何受此写入操作影响的结果设定为无效,用以防止缓存和数据库之间出现数据不一致。

缓存的优缺点主要如下:

优点:可以大幅度降低数据库负载,更好的分配了资源,提供了更快速的数据访问;

缺点:在需要访问cache的对象比较多的时候,应用程序所需要的代码量会增加很多,同时系统复杂度以及维护成本也会增高。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics