关于一个分表面试题

题目

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秒

突然觉得很神奇:)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分库分表是一种常用的数据库优化手段,特别适用于数据量大且并发访问高的场景。以下是关于MySQL分库分表的一些面试题: 1. 请问什么是分库分表? 分库分表是指将一个大型数据库分成多个小的数据库,再将每个小的数据库进行水平或垂直切分,从而达到提高数据库性能和扩展能力的目的。 2. 为什么需要进行分库分表? 分库分表可以解决数据库在高并发情况下的性能瓶颈问题,提高数据库的读写能力和负载均衡能力。同时,它还可以解决单表数据量过大导致查询效率低下的问题。 3. 分库分表的常用策略有哪些? 常见的分库分表策略包括水平分表和垂直分表。水平分表是指将一个表的行数据按照某种规则分散到多个表中,例如按照用户ID或时间进行分表;垂直分表是指将一个表按照列的属性划分到多个表中,例如将经常被查询的列和不常被查询的列分成两个表。 4. 分库分表的中间件有哪些? 在实际应用中,常常使用分库分表中间件来简化分库分表的操作。常见的分库分表中间件有Mycat和sharding-jdbc等。 5. 分库分表可能会带来哪些问题? 分库分表可能会对事务处理、跨节点Join操作和分布式事务等方面带来一些挑战。需要注意解决这些问题,以保证分库分表的正确性和稳定性。 以上是关于MySQL分库分表的一些面试题目,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值