首页 » PHP教程 » php分区分表技巧_MySQL数据库机能优化之分区分表分库

php分区分表技巧_MySQL数据库机能优化之分区分表分库

访客 2024-12-18 0

扫一扫用手机浏览

文章目录 [+]

分表,最直白的意思,便是将一个表构造分为多个表,然后,可以再同一个库里,也可以放到不同的库。

当然,首先要知道什么情形下,才须要分表。
个人以为单表记录条数达到百万到千万级别时就要利用分表了。

php分区分表技巧_MySQL数据库机能优化之分区分表分库

分表的分类

php分区分表技巧_MySQL数据库机能优化之分区分表分库
(图片来自网络侵删)

1、纵向分表

将本来可以在同一个表的内容,人为划分为多个表。
(所谓的本来,是指按照关系型数据库的第三范式哀求,是该当在同一个表的。

分表情由:根据数据的生动度进行分离,(由于不同生动的数据,处理办法是不同的)

案例:

对付一个博客系统,文章标题,作者,分类,创建韶光等,是变革频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。
而博客的浏览量,回答数等,类似的统计信息,或者别的变革频率比较高的数据,我们把它叫做生动数据。
以是,在进行数据库构造设计的时候,就该当考虑分表,首先是纵向分表的处理。

这样纵向分表后:

首先存储引擎的利用不同,冷数据利用MyIsam 可以有更好的查询数据。
生动数据,可以利用Innodb ,可以有更好的更新速率。

其次,对冷数据进行更多的从库配置,由于更多的操作时查询,这样来加快查询速率。
对热数据,可以相对有更多的主库的横向分表处理。

实在,对付一些分外的生动数据,也可以考虑利用memcache ,redis之类的缓存,等累计到一定量再去更新数据库。
或者mongodb 一类的nosql 数据库,这里只是举例,就先不说这个。

2、横向分表

字面意思,就可以看出来,是把大的表构造,横向切割为同样构造的不同表,如,用户信息表,user_1,user_2等。
表构造是完备一样,但是,根据某些特定的规则来划分的表,如根据用户ID来取模划分。

分表情由:根据数据量的规模来划分,担保单表的容量不会太大,从而来担保单表的查询等处理能力。

案例:同上面的例子,博客系统。
当博客的量达到很大时候,就该当采纳横向分割来降落每个单表的压力,来提升性能。
例如博客的冷数据表,如果分为100个表,当同时有100万个用户在浏览时,如果是单表的话,会进行100万次要求,而现在分表后,就可能是每个表进行1万个数据的要求(由于,不可能绝对的均匀,只是假设),这样压力就降落了很多很多。

延伸:为什么要分表和分区?

日常开拓中我们常常会碰着大表的情形,所谓的大表是指存储了百万级乃至千万级条记录的表。
这样的表过于弘大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情形,性能会更加糟糕。
分表和表分区的目的便是减少数据库的包袱,提高数据库的效率,常日点来讲便是提高表的增编削查效率。

什么是分表?

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表构造文件。
这些子表可以分布在同一块磁盘上,也可以在不同的机器上。
app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。

什么是分区?

分区和分表相似,都是按照规则分解表。
不同在于分表将大表分解为多少个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。
分区后,表面上还是一张表,但数据散列到多个位置了。
app读写的时候操作的还是大表名字,db自动去组织分区的数据。

MySQL分表和分区有什么联系呢?

1、都能提高mysql的性高,在高并发状态下都有一个良好的表现。

2、分表和分区不抵牾,可以相互合营的,对付那些大访问量,并且表数据比较多的表,我们可以采纳分表和分区结合的办法(如果merge这种分表办法,不能和分区合营的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采纳分区的办法等。

3、分表技能是比较麻烦的,须要手动去创建子表,app做事端读写时候须要打算子表名。
采取merge好一些,但也要创建子表和配置子表间的union关系。

4、表分区相对付分表,操作方便,不须要创建子表。

我们知道对付大型的互联网运用,数据库单表的数据量可能达到千万乃至上亿级别,同时面临这高并发的压力。
Master-Slave构造只能对数据库的读能力进行扩展,写操作还是集中在Master中,Master并不能无限制的挂接Slave库,如果须要对数据库的吞吐能力进行进一步的扩展,可以考虑采取分库分表的策略。

1、分表

在分表之前,首先要选中得当的分表策略(以哪个字典为分表字段,须要将数据分为多少张表),使数据能够均衡的分布在多张表中,并且不影响正常的查询。
在企业级运用中,每每利用org_id(组织主键)做为分表字段,在互联网运用中每每是userid。
在确定分表策略后,当数据进行存储及查询时,须要确定到哪张表里去查找数据,

数据存放的数据表 = 分表字段的内容 % 分表数量

2、分库

分表能够办理单表数据量过大带来的查询效率低落的问题,但是不能给数据库的并发访问带来质的提升,面对高并发的写访问,当Master无法承担高并发的写入要求时,不管如何扩展Slave做事器,都没故意义了。
我们通过对数据库进行拆分,来提高数据库的写入能力,即所谓的分库。
分库采取对关键字取模的办法,对数据库进行路由。

数据存放的数据库=分库字段的内容%数据库的数量

3、即分表又分库

数据库分表可以办理单表海量数据的查询性能问题,分库可以办理单台数据库的并发访问压力问题。

当数据库同时面临海量数据存储和高并发访问的时候,须要同时采纳分表和分库策略。
一样平常分表分库策略如下:

中间变量 = 关键字%(数据库数量单库数据表数量)

库 = 取整(中间变量/单库数据表数量)

表 = (中间变量%单库数据表数量)

实例:

1、分库分表

很明显,一个主表(也便是很主要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的办理路子,也便是性能优化路子,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,牛逼的代码大概是这样子:

复制代码 代码如下:

<?php

for($i=0;$i< 100; $i++ ){

//echo "CREATE TABLE db2.members{$i} LIKE db1.members<br>";

echo "INSERT INTO members{$i} SELECT FROM members WHERE mid%100={$i}<br>";

}

?>

2、一直机修正mysql表构造

同样还是members表,前期设计的表构造不尽合理,随着数据库不断运行,其冗余数据也是增长巨大,同事利用了下面的方法来处理:

先创建一个临时表:

/创建临时表/

CREATE TABLE members_tmp LIKE members

然后修正members_tmp的表构造为新构造,接着利用上面那个for循环来导出数据,由于1000万的数据一次性导出是不对的,mid是主键,一个区间一个区间的导,基本是一次导出5万条吧,这里略去了

接着重命名将新表更换上去:

/这是个颇为经典的语句哈/

RENAME TABLE members TO members_bak,members_tmp TO members;

便是这样,基本可以做到无丢失,无需停机更新表构造,但实际上RENAME期间表是被锁去世的,以是选择在线少的时候操作是一个技巧。
经由这个操作,使得原来8G多的表,一下子变成了2G多。

标签:

相关文章