您的位置:首页 > 职场人生

关于一个分表面试题

2016-07-28 17:40 281 查看

题目

T1表包含:

aid,bid(联合主键)

其中aid每天业务增长行数大约在10万-20万

bid固定为1万个

也就是说,1个aid的记录会产生1万条aid+bid的记录

现在是按天分表,但是每天依然会有超过10亿的数据在一张表

请问各位,在按天分表的基础上,我还应该怎么分表?按照bid来分?分多少?

存储引擎为innodb

思路

原来是每天10亿条数据在一张表上增加

1.按bid每天分为100个分表,没张表一天1000万的增长量,每天产生300个分表

2.按bid每天分为1000个分表,没张表一天100万的增长量,每天产生3000个分表

觉得还是方法一靠谱一点,因为索引文件每天增加3000个是挺可怕的。不知道这是不是这样分的。

对于innodb这么大的表,怎么进行语句上的优化呢,因为如果where aid = XX的话,假设这个表上有几个特别大的字段,varchar(3000)之类的,那么查询速度是非常慢的,因为是聚簇索引。

建表(aid=id,bid=ver)

create table t1(

id char(64) not null,

ver int(11) not null default 0,

str1 varchar(3000),

str2 varchar(3000),

str3 varchar(3000),

);

alter table t1 add index aid_bid(id,ver);

插入数据

<?php
$conn = mysql_connect('localhost','root');
mysql_query('use soknot',$conn);
mysql_query('set names utf8',$conn);
//var_dump($conn);
$str = str_repeat('m',3000);
set_time_limit(0);
for($i=1;$i<=10000;$i++)
{
$id = dechex($i);

$sql = sprintf("insert into t1 values('%s','%d','%s','%s','%s')",$i,$i,$str,$str,$str);

mysql_query($sql,$conn);
}


查看语句(show profiles)



可以看出花了2.8秒才返回数据

如果索引覆盖查找id:



可看到非常快

用上索引覆盖去查找id,然后再在聚簇索引上查找文件,那么速度会快很多:



可以看到从原来2.8秒变成了0.013秒

突然觉得很神奇:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: