当前位置: 首页 > 编程笔记 >

MySQL分表和分区的具体实现方法

令狐阳秋
2023-03-14
本文向大家介绍MySQL分表和分区的具体实现方法,包括了MySQL分表和分区的具体实现方法的使用技巧和注意事项,需要的朋友参考一下

垂直分表

垂直分表就是一个包含有很多列的表拆分成多个表,比如表A包含20个字段,现在拆分成表A1和A2,两个表各十个字段(具体如何拆根据业务来选择)。

优势:在高并发的情境下,可以减少表锁和行锁的次数。

劣势:在数据记录非常大的情况下,读写速度还是会遇到瓶颈。

水平分表

假如某个网站,它的数据库的某个表已经达到了上亿条记录,那么此时如果通过select去查询,在没有索引的情况下,他的查询会非常慢,那么就可以通过hash算法将这个表分成10个子表(此时每个表的 的数据量只有1000万条了)。

同时生成一个总表,记录各个子表的信息,假如查询一条id=100的记录,它不再需要全表扫描,而是通过总表找到该记录在哪个对应的子表上,然后再去相应的表做检索,这样就降低了IO压力。

劣势:会给前端程序应用程序的SQL代码的维护带来很大的麻烦,这时候可以使用MySQL的Merge存储引擎实现分表。

---------------------------------------我是蛋疼的分割线----------------------------------------------------

用Merge存储引擎分表,对应用程序的SQL语句来说是透明的,不需要修改任何代码。

CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1');
INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2');
CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

在创建total表的时候可能报错:

Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist

实际上merge存储引擎是一个虚拟的表,对应的实际表必须是myisam类型的表,如果你的mysql是5.1以上版本,默认数据库使用的事InnoDB存储引擎的,所以在创建total时,t1和t2表必须是myisam存储引擎的。

如果需要定期增加分表,只需要修改merge表的union即可。

CREATE TABLE t3( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
ALTER TABLE total UNION=(t1,t2,t3)

横向分区

举例说明:假如有100W条数据,分成十份,前10W条数据放到第一个分区,第二个10W条数据放到第二个分区,依此类推。取出一条数据的时候,这条数据包含了表结构中的所有字段,横向分区并没有改变表的结构。

纵向分区

举例说明:在设计用户表的时候,开始的时候没有考虑好,而把个人的所有信息都放到了一张表里面去,这个表里面就会有比较大的字段,如个人简介,而这些简介呢,也许不会有好多人去看,所以等到有人要看的时候,再去查找,分表的时候,可以把这样的大字段,分开来

完整的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

 类似资料:
  • 本文向大家介绍mysql分表和分区的区别浅析,包括了mysql分表和分区的区别浅析的使用技巧和注意事项,需要的朋友参考一下 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表。 一、什么是mysql分表和分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同

  • 一、分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。 分区为 HDFS 上表目录的子目录,数据按照分区存储在子目录中。如果查询的 where 字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。 这里说明一下分区表并 Hive 独有的概念,实际上这个概念

  • 本文向大家介绍MySQL优化之分区表,包括了MySQL优化之分区表的使用技巧和注意事项,需要的朋友参考一下 当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种:   1、分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多。     优点:提高并发量,减小锁的粒度     缺点:代码维护成本高,相关sql都需要改动   2、分区,所有的数

  • 问题内容: 我的iPhone应用程序连接到我的PHP Web服务,以从MySQL数据库检索数据。一个请求可以返回500个结果。 一次实现分页并检索20个项目的最佳方法是什么? 假设我从数据库中收到了前20个广告。现在如何请求接下来的20个广告? 问题答案: 从MySQL文档: LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数字参数,这两个参数都必须是非负整数常量(使用

  • 本文向大家介绍PHP区块查询实现方法分析,包括了PHP区块查询实现方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP区块查询实现方法。分享给大家供大家参考,具体如下: 分块查询是介于顺序查询和折半查询之间的一种查询方法。 其实折半查询就是每次折半的分块查询,那么分块查询就是把数组分成区块,然后每个区块进行查询的查询方法。 本例的数组是已经排序号的,分块后进行顺序查询。 php代

  • 问题内容: “独立实体”是什么意思?在交易期间如何将托管实体转换为独立实体? 问题答案: 分离实体是状态不能由JPA提供程序反映的实体。 换句话说,如果您更改其状态(即通过setter方法),则这些更改将不会保存到基础数据库中,因为JPA提供程序不必“观察”此类实体。 如果实体E1是受管实体,则可以使其分离调用(非常合理的命名)方法。您还可以使用它将清除整个PersistenceContext并有