关于一个分表面试题
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秒
突然觉得很神奇:)
相关文章推荐
- JAVA面试题相关基础知识
- 13张IT职业技能&学习图谱
- php面试题目
- 面试题58:二叉树的下一个节点
- 面试总结(malloc、虚继承、assert)
- 那些程序员们后知后觉的职涯经验
- 机器学习面试问题2
- Java常用排序算法/程序员必须掌握的8大排序算法
- 面试题57:删除链表中的重复节点
- Java基础面试题之Singleton模式
- Java Web 初级程序员 : 第二天学习内容
- 剑指offer面试题31、34、36、38
- 前端面试题及答案整理(二)
- 面试题56:链表中环的入口节点
- 十道海量数据处理面试题与十个方法大总结
- 我的程序员之路
- web前端面试题及答案整理(一)
- 伟大的程序员是怎样炼成的?
- 程序员的30本书——经典中的经典
- 面试题