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

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

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

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

(1)垂直分割

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

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

(2)水平分割

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

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

下面通过创建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数据了。

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9968104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存