Mysql目录结构

一个库一个目录

MyISAM引擎

InnoDB引擎

分库分表分区总结

对于分区分表 都可以进行横向(按表字段分),纵向分(按数据行分),此文暂时值考虑横向分。

对于分库:分库

分区

说明

分区和分表类似,把原本的一个数据量很大的表,根据规则分成很多块。这些块可以跨磁盘分布。突破单磁盘IO的限制。

好处

  1. 分区为了突破IO瓶颈,可以把索引及数据文件放在不同磁盘。
  2. 可以根据自定义的分区方式 优化查询,比如根据分区列查询,就会定位到某个分区只查某分区的数据。
  3. 完全在数据库层面操作,与代码解耦,不需要java代码等进行逻辑处理,后期增加,拆分,合并,删除 方便。
  4. 不用关心跨分区统计查询问题,数据库层面已经处理好。

缺点

  1. 要事先预估数据量,后期可能会随着数据的增加而需要重新映射分区。
  2. 只能在一个数据库实例中,内存加载和计算只能在一台机器中。

分表

说明

分表是建立多张子表,每张表的表字段相同,根据映射算法把数据分到不同子表。数据文件只能在一个磁盘上,一个数据库实例中。

好处

  1. 可以根据自定义的表字段映射算法,把每次增删改查时的操作映射到的表,这样可以少查询数据。可以数据量很大的表表 横向拆分为多个子表。

缺点

  1. 需要java代码逻辑处理映射算法。比较复杂。

(2)只能在一个数据库实例中,只能在一个磁盘中,内存加载和计算只能在一台机器中。

(3)要事先预估数据量,后期可能会随着数据的扩容重新扩展映射表。

(4)对于跨子表的统计查询,会比较复杂。

分库

好处

分库 可以突破服务器单节点内存,和计算的的限制。具体可以通自定义程序逻辑实现。根据场景自己实现即可。

如:主从备份读写分离,数据库按业务进行分(纵向)。把一张很大的表横向切分 并放在不同的库中(映射方法类似于分表分区)。

缺点

分库要考虑跨库多表查询的问题。

要考虑分布式事务的问题。

分区

主要可以利用多个磁盘,提高IO性能。

分区把一个表数据和索引存储到多个不同的地方,跨磁盘,(可以跨文件系统,前提是当前系统可以看到此文件系统),可以指定每个分区文件存储的位置。

分区可以分为垂直分区(对一个大表,拆字段分别放在不同分区),和水平分区(把特定的某些行分开存放)。目前mysql只支持水平分区。

指定分区所在磁盘的文件:Mysql数据库表分区跨磁盘存储 表分区放到不同的磁盘 表分区存储到指定磁盘路径_Alex许恒的博客-CSDN博客_mysql 不同数据库放不同目录

分区具体命令操作:MYSQL表分区,查看分区_成功不打折扣的博客-CSDN博客_mysql 分区查询

分区可以调整(如把一个分区调整为2个),可以合并(如把两个分区合并为一个),可以追加,可以删除

在做分区前,也要先预估数据量,然后分为几个区。最好是按照时间分区,比如一年一个分区,这样就不用预估多少个分区,每一年开始就追加一个分区即可

Mysql分区类型

根据所使用的不同分区规则可以分成几大分区类型。

RANGE 分区:

基于属于一个给定连续区间的列值,把多行分配给分区。

LIST 分区:

类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

HASH分区:

基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。

KEY

分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

复合分区:

基于RANGE/LIST 类型的分区表中每个分区的再次分割。子分区可以是 HASH/KEY 等类型。

对表做range分区

create table t5 (a varchar(20) not null,b varchar(11) not null,id int not null) partition by range(id)

(

partition s1 values less than(2000000),

partition s2 values less than(4000000),

partition s3 values less than(10000000)

)

可见分为三个区后,在mysql的数据库目录下,多了三个ibd分区的文件,和一个frm的表信息文件。

不使用分区列查询,可以看到用到了三个分区

分区约束

  1. 在5.1版本中分区表对唯一约束有明确的规定,每一个唯一约束必须包含在分区表的分区键(也包括主键约束)。
  2. 还有很多约束,比如不能外键,以及innordb,MyISAM引擎上的约束等等。

分区后查询性能

注意此处测试时,我所有分区都在一个磁盘,所以不考虑多个磁盘会提升IO性能的问题。

test1是没有分区的表,t5是分为三个区的表(按照id:<2000000,<4000000,<10000000)。两个表都没有索引,数据都一样,总量都为6291456条。

两个 表格式如下

条件不包含分区列

可以看到,条件如果没有分区列,则会查询三个分区。速度上两者差不多。

条件包含分区列

在一个分区内的数据查询

可以看到只使用一个分区。速度要比不分区要快的多。

数据跨两个分区

可以看到id<2500000的数据跨了两个分区。同样比不分区要快。

跨所有分区

当条件id<4500000时跨所有三个分区,速度上两者差不多。

分表

分表有多种方式,目前我们只说两种。做分表前,最好要提前预估数据量(不然后面要增加子表需要重建映射关系),并根据数据量 确定使用的映射子表的算法。最好能够按年进行分表,这样就能很好的解决建多少张表的问题。

另外可以考虑一致性hash。

Merge引擎实现表合并(不推荐)

主要原理是利用MERGE引擎创建一个主表,把两张子表关联起来(方便总的统计查询)。这样只查询主表即可。但是由于主表插入的函数只有两个选项LAST或者FIRST(即插入到最后一个子表或者第一个子表)。因此需要自己再程序中创建映射子表的算法。

Sql语句

  1. 创建两张子表(必须使用MyISAM引擎),并添加数据
  1. mysql> CREATE TABLE IF NOT EXISTS `user1` (
  2. ->   `id` int(11) NOT NULL AUTO_INCREMENT,
  3. ->   `name` varchar(50) DEFAULT NULL,
  4. ->   `sex` int(1) NOT NULL DEFAULT '0',
  5. ->   PRIMARY KEY (`id`)
  6. -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  7. Query OK, 0 rows affected (0.05 sec)
  8. mysql> CREATE TABLE IF NOT EXISTS `user2` (
  9. ->   `id` int(11) NOT NULL AUTO_INCREMENT,
  10. ->   `name` varchar(50) DEFAULT NULL,
  11. ->   `sex` int(1) NOT NULL DEFAULT '0',
  12. ->   PRIMARY KEY (`id`)
  13. -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  14. Query OK, 0 rows affected (0.01 sec)
  15. mysql> INSERT INTO `user1` (`name`, `sex`) VALUES('张映', 0);
  16. Query OK, 1 row affected (0.00 sec)
  17. mysql> INSERT INTO `user2` (`name`, `sex`) VALUES('tank', 1);
  18. Query OK, 1 row affected (0.00 sec)
  1. 创建主表(必须使用MRG_MYISAM引擎)
  1. ysql> CREATE TABLE IF NOT EXISTS `alluser` (
  2. ->   `id` int(11) NOT NULL AUTO_INCREMENT,
  3. ->   `name` varchar(50) DEFAULT NULL,
  4. ->   `sex` int(1) NOT NULL DEFAULT '0',
  5. ->   INDEX(id)
  6. -> ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=NO AUTO_INCREMENT=1 ;
  7. Query OK, 0 rows affected, 1 warning (0.00 sec)

上述sql 中TYPE=MERGE表示使用MERGE存储引擎; UNION=(user1,user2) 表示要把两张表组合一起,INSERT_METHOD=NO 表示不允许插入主表。使用first或last值使得插入被相应地做在第一或最后一个表上。如果你没有指定insert_method选项,或你用一个no值指定该选,则表示不允许插入主表。

总结

a1,a2,a3为子表,a为主表。数据文件如下

基于MERGE创建的分表,子表必须是myisam, 主表必须是mrg_myisam。此分表只有一个作用,就是利用MERGE合并表的方式,能够统计所有分表的信息(其实完全可以使用sql语句union all)。完全不建议使用。

完全基于自定义映射算法

通过预估数据量,指定数据映射算法,对每次增删改查操作映射到不同的子表上,减少查询数据量。

mysql 分库分表分区总结相关推荐

  1. MySQL 分库分表与分区的区别和思考

    一.分分合合 说过很多次,不要拘泥于某一个技术的一点,技术是相通的.重要的是编程思想,思想是最重要的.当数据量大的时候,需要具有分的思想去细化粒度.当数据量太碎片的时候,需要具有合的思想来粗化粒度. ...

  2. MySQL分库分表多维度查询——比较好的方法

    转载自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL分库分表,一般只能按照一个维度进行查询. 以订单表为例, 按照用户ID mod 6 ...

  3. MySQL运维(二)MySQL分库分表概念及实战、读取分离详解

    MySQL运维(二)MySQL分库分表详解.读取分离详解 1.MySQL分库分表相关概念 1.1 分库分表概念 1.1.1 分库的原因 分库:就是一个数据库分成多个数据库,部署到不同机器. 如果业务量 ...

  4. MySQL分库分表面试知识总结

    场景分析 Web开发工作,亦或是海量数据开发工作,学习分库.分表.分区等知识都是很有必要的 . 面试的时候,也有可能也会被问到.不过作为一个有经验的Coder,不熟悉分库.分表技术确实有些 low. ...

  5. MySQL分库分表会带来哪些问题?分库分表问题

    MySQL分库分表会带来哪些问题? 分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO.硬件资源.连接数的瓶颈,同时也带来了一些问题.下面将描述这些技术挑战以及对应的解决思路. 分库分表 ...

  6. 利用RadonDB实现MySQL分库分表

    利用RadonDB实现MySQL分库分表 RadonDB是青云上提供的MySQL分布式解决方案,提供数据库的透明拆分及高可用服务.RadonDB包括Radon, Xenon, MySQL三部分安装.其 ...

  7. 【mysql】MySQL 分库分表方案,总结的非常好!

    文章目录 1. 数据库架构演变 2. 分库分表前的问题 3. 分库分表的方式方法 3.1 垂直分库 3.2 水平拆分 水平分表 水平分库分表 水平分库分表切分规则 4. 分库分表后面临的问题 4.1 ...

  8. 【分库、分表】MySQL分库分表方案

    一.Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. ...

  9. mysql分库分表(一)

    参考: https://blog.csdn.net/xlgen157387/article/details/53976153 https://blog.csdn.net/clevercode/arti ...

最新文章

  1. 历史 history
  2. AutoConfig工具使用
  3. cordova在IOS初次运行,loading加载很久的解决办法
  4. python 通过shutil.move移动图片出错xe5\xb8\xb8\xe7
  5. C++ 数值的整数次方 (最小int取反,递归实现乘方)
  6. 阿里云分布式缓存OCS与DB之间的数据一致性
  7. easyui datagrid不是相邻的能合并单元格吗_介绍一种划分账龄的方法,要不了半个小时就能完成...
  8. Pdshell教程-利用现有数据库(没有PDM情况下)导出数据库PMD文件
  9. cursor: mutex S等待事件
  10. iOS modal view的关闭和显示问题
  11. [react] render在什么时候会被触发?
  12. 2017.9.12 人员雇佣 失败总结
  13. 嵌入式Linux要学哪些东西?你真的造吗?
  14. JVM对象内存分配机制之对象在Eden区分配(五)
  15. 两个一一对应的txt文本去重
  16. 嵌入式系统开发流程是怎样的?
  17. STM8S003外部中断配置
  18. [新] 入手树莓派后要做的一些事
  19. 大数据工程师需要哪些基础知识?
  20. 应聘dba职位到底需要多少经验

热门文章

  1. python实现区域截屏(类似于QQ微信截图)功能
  2. geoserver 发布影像数据_geoserver 自动发布shp与正射影像
  3. 数据解析NFT Q1市场表现:NFT生态正向Polygon聚拢,蓝筹项目“保值“难
  4. sylixos licesence 问题
  5. java crud是什么_为现有数据库开发Java CRUD的最佳框架是什么?
  6. 期刊分类abcde_论文的级别分为几个,如何划分
  7. Tensorflow之Estimator(二)实践
  8. Import chainer报错:def shape(self) -> types.Shape:
  9. UVALive 7040 Color (容斥原理 + 组合数学递推公式 + 求逆元 + 基础数论)
  10. 华为云计算——FusionCompute私有云设计