成都网站建设设计

将想法与焦点和您一起共享

mysql数据量怎么分表 数据库怎么分表

分库分表最佳实践

MySQL单表(innoDB)可以存储10亿级数据,只是这时候性能比较差,业界公认MySQL单表容量在1KW以下是最佳状态,因为这时它的BTREE索引树高在3~5之间。

成都创新互联从2013年创立,先为姚安等服务建站,姚安等地企业,进行企业商务咨询服务。为姚安企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

参考阿里开发手册建议:

1.单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表;如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

2.实际情况受mysql机器配置等多方面影响,可能数据量很大但性能依旧不错,但考虑后续发展一定要进行分库分表考虑。

根据实际的业务场景选择合适的分片数据,参考如下:

根据实际的业务场景选择适当的分片字段,要达到如下要求:

分表数量和分表字段确定后,要设计一个合理的分表规则,良好的分表规则要达到如下条件:

如何保证分片数据均匀,参考:

如何保证方便后续分片扩容,参考:

如何高效的使用分库分表,核心是做到尽量的路由到最少的表,最好是只路由到一个表里面

核心规则如下:

阶段一

阶段二

阶段三

本文链接:

1亿条数据如何分表100张到Mysql数据库中(PHP)

下面通过创建100张表来演示下1亿条数据的分表过程,具体请看下文代码。

当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度。笔者做了一个简单的尝试,1亿条数据,分100张表。具体实现过程如下:

首先创建100张表:

$i=0;

while($i=99){

echo

"$newNumber

\r\n";

$sql="CREATE

TABLE

`code_".$i."`

(

`full_code`

char(10)

NOT

NULL,

`create_time`

int(10)

unsigned

NOT

NULL,

PRIMARY

KEY

(`full_code`),

)

ENGINE=MyISAM

DEFAULT

CHARSET=utf8";

mysql_query($sql);

$i++;

下面说一下我的分表规则,full_code作为主键,我们对full_code做hash

函数如下:

$table_name=get_hash_table('code',$full_code);

function

get_hash_table($table,$code,$s=100){

$hash

=

sprintf("%u",

crc32($code));

echo

$hash;

$hash1

=

intval(fmod($hash,

$s));

return

$table."_".$hash1;

}

这样插入数据前通过get_hash_table获取数据存放的表名。

最后我们使用merge存储引擎来实现一张完整的code表

CREATE

TABLE

IF

NOT

EXISTS

`code`

(

`full_code`

char(10)

NOT

NULL,

`create_time`

int(10)

unsigned

NOT

NULL,

INDEX(full_code)

)

TYPE=MERGE

UNION=(code_0,code_1,code_2.......)

INSERT_METHOD=LAST

;

这样我们通过select

*

from

code就可以得到所有的full_code数据了。

以上介绍就是本文的全部内容,希望对大家有所帮助。

mysql数据库要放1亿条信息怎样分表?

mysql数据库对1亿条数据的分表方法设计:

目前针对海量数据的优化有两种方法:

(1)垂直分割

优势:降低高并发情况下,对于表的锁定。

不足:对于单表来说,随着数据库的记录增多,读写压力将进一步增大。

(2)水平分割

如果单表的IO压力大,可以考虑用水平分割,其原理就是通过hash算法,将一张表分为N多页,并通过一个新的表(总表),记录着每个页的的位置。

假如一个门户网站,它的数据库表已经达到了1亿条记录,那么此时如果通过select去查询,必定会效率低下(不做索引的前提下)。为了降低单表的读写IO压力,通过水平分割,将这个表分成10个页,同时生成一个总表,记录各个页的信息,那么假如我查询一条id=100的记录,它不再需要全表扫描,而是通过总表找到该记录在哪个对应的页上,然后再去相应的页做检索,这样就降低了IO压力。

mysql水平分表的几种方法

1.按时间分表

这种分表方式有一定的局限性,当数据有较强的实效性,如微博发送记录、微信消息记录等,这种数据很少有用户会查询几个月前的数据,如就可以按月分表。

2.按区间范围分表

一般在有严格的自增id需求上,如按照user_id水平分表:

table_1  user_id从1~100w 

table_2  user_id从101~200w 

table_3  user_id从201~300w 

... 

3.hash分表

通过一个原始目标的ID或者名称通过一定的hash算法计算出数据存储表的表名,然后访问相应的表。

按如下分10张表:

function get_hash_table($table, $userid)

{

$str = crc32($userid);

if ($str  0) {

$hash = "0" . substr(abs($str), 0, 1);

} else {

$hash = substr($str, 0, 2);

}

return $table . "_" . $hash;

}

echo get_hash_table('message', 'user18991'); //结果为message_10

echo get_hash_table('message', 'user34523'); //结果为message_13

mysql数据库分表

横向分表:例如将创建时间在05年之前的数据放在一个分区上,将05年到08年之间的数据放到另一个分区上,以此类推。

到底要根据那个列进行横向的分区和查询有关系,在建表的时候需要分析,会根据那个列进行查询。

思路这样,具体事情具体分析。


网页名称:mysql数据量怎么分表 数据库怎么分表
地址分享:http://chengdu.cdxwcx.cn/article/dooecge.html