一、为什么要进行分库分表

一般mysql单表存储数据量小于1千万左右的时候,它的读写性能是最好的。但是当业务发展到一定程

度,数据增长到一定程度的时候,我们就会发现为什么查询速度越来越慢了,甚至还会出现数据库挂了

等其他一系列问题。数据量大时主要出现的问题可以归纳为以下几点:

mysql 大数据 存储 大数据量mysql解决方案_分库分表

那么此时我们就需要采取一些方案来解决这些问题。通常我们有以下几种方式:
1、分库分表
2、读写分离
3、利用NoSql
而我们比较常用的是“分库分表”和“读写分离”,下面我们就来对这两种方式的进行一个深入的了解。

二、分库分表

数据库分库分表,也叫数据库分片,分片主要分为两种实现方式。垂直分片和水平分片。

1、垂直分片。

按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。

在拆分之前,一个数据库由多个数据表构成,每个表对应着不同的业务。而拆分之后,则是按照业务将

表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库。下图展示了根据业务需要,将

用户表和订单表垂直分片到不同的数据库的方案。

mysql 大数据 存储 大数据量mysql解决方案_java_02

2、水平分片

水平分片又称为横向拆分。相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或

某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。

例如:根据主键分片,偶数主键的记录放入0库(或表),奇数主键的记录放入1库(或表)

mysql 大数据 存储 大数据量mysql解决方案_数据库_03

三、读写分离

在说到读写分离之前,我们需要了解一下mysql的两种存储引擎 InnoDB与MyISAM。如果你需要事务处理,那么InnoDB 可能是比较好的方式。如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的。

事务支持,是一个影响你选择什么样存储引擎的重要因素,事务支持趋向于选择InnoDB方式,因为其支持事务处理和故障恢复。另外InnoDB可以利用事务日志进行数据恢复,这会比MyISAM快很多。而MyISAM可能会需要几个小时甚至几天来干这些事,InnoDB 只需要几分钟。

当然操作数据库表的习惯可能也会是一个对性能影响很大的因素。比如: COUNT() 在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦。另外MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。MyISAM还提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。在
读多写少的业务,如果不介意MyISAM的崩溃恢复问题,选用MyISAM引擎是合适的。

我们总结一下,根据应用场景而言:

MyISAM更适合管理非事务表。

它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

InnoDB更适合用于事务处理应用程序。

具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

由于MySQL的引擎各有千秋,我们又希望能结合两种引擎的优势,摒弃各自的劣势,创造出一种接近“理想”状态的使用方式,既可以做到InnoDB的事务处理,又可以使用到MyISAM特性。而这种方式简单概括起来就是:

在读写分离模式当中, 写节点使用MySql的InnoDB引擎,读节点使用的是MySql的MyISAM引擎。