最近面试,问到关与mysql数据库的分表一些问题,如设计一个千万级别的会员数据库,当时想到了分表,但是当问到如何跟据username查询到用户的信息时,这时,有点卡住了,所以为了让自已重新认识分表,而记录下来。
垂直分表:
其实没啥好讲,就是 主键+常用列 放在原表中,再讲 主键+一些不常用列 放在另外的表中。
这样一个数据页就可以存放更多数据。 但是缺点也明显,可能会增加join 或 union之类的操作。
水平分表:
今天面试被问到水平分表,突然愣住了,分都知道,但分完如何有效查询就不好说了。
原则:具体情况具体分析。
常见几种分法:
1、按时间分
典型应用:新闻类、qq状态、朋友圈动态等关注实时或最近的,可以用时间划分,比如当月一张表,上个月一张表。
2、按区间分
通常每张表都会有个自增id,可以利用自增id分,比如
user1表 是1~50
user2表 是51~100 //insert 操作完成后,判断id值,超过50w时,创建新表
3、hash分表
实质上没啥意思,对每一条插入的数据进行取模, 对于单挑记录查询还ok,如果查询相邻几行数据时,就悲剧了。 感兴趣的同学可以看下面相关链接第一条。
分表后查询:
1、对于时间水平分表:
假设朋友圈状态表,每天都会产生20w条记录, 建表 table_20150401 存放。然后用cron跑一个脚本,每天晚上凌晨创建新表,比如 table_20150402。在php程序中
执行插入的函数进行封装,使用下面这两个函数。
insertData($data){ $table = "table_".date("Ymd",time()); //生成当天表名 insert($data,$table); // 插入新的表中 } GetData($condition){ //如果条件里面带了时间查找,比如:$condition[time] , 则分析出对应表名,选择对应一张或多张表 $table = "table_".date("Ymd",time()); //生成当天表名 Get($condition,$table); // 在新的表中查找 }
2、对于id区间划分
新闻或朋友圈状态id 1~1000 1001~2000
一、数据库里面建表 breakup_table //这个表里专门记录,新分表和原表的 记录数,方便确定查找哪个表
比如: news_1 1 //起始key为1
news_2 1001 //起始key为1001
news_3 2001
二、上述 news_1 之类的数据,第一次需要同数据库拿,之后可以放到session或memcached里面
insertUser($data){
$table_num = getCurrentNewNum(); //这个值用memcached去包裹,if($count < 2001)return 3;elseif($count < 1001)return 2;else 1; $table = "table_".$table_num); //生成指定表名 insert($data,$table); // 插入新的表中 } GetUser($condition){ $table_num = getCurrentNewNum(); $table = "table_".$table_num); //生成指定表名 Get($condition,$table); // 在新的表中查找 }
3、对于hash分表查询:
典型user表 //单独拉出来讲,因为比较特别,第一次查找可能比较花时间,因为必须根据用户名确定去找哪个表
可以这做:
$md5_val = md5($user_name); //用crc32()应该也可以,但未尝试,如果尝试记得%u,使其不为负
$first_val = substr($md5_val, 0,1);//然后去取第一个值
$decimal = hexdec($first_val); //十六进制转十进制
$table_num = $decimal%3 + 1; // 求余3,使得只有三张表,table_1,table_2,table_3
主要原理,利用user_name唯一性,导出md5唯一性,然后求余限制分表数量
insertUser($data){ $table = "table_".$table_num); //生成指定表名 insert($data,$table); // 插入新的表中 } GetUser($condition){ $table = "table_".$table_num); //生成指定表名 Get($condition,$table); // 在新的表中查找 }
hash 分表也可用于id区间分表,即用id值 取模。
水平分表,典型缺点,对于group by或order by之类的查询是灾难。
相关链接:
http://www.phpddt.com/php/mysql-tables.html //介绍了利用merge分表
相关推荐
分库分表是将大数据量的单一表分成多个小表,分布在不同的数据库服务器上,从而缓解单表压力,提高查询效率。MyCat作为中间件,负责路由规则的制定,根据业务请求自动将数据路由到正确的数据库和表。 Haproxy是一款...
MySQL分表及分表后插入sql语句,表为订单表,可以参考一下
MySQL 架构的演变主要经历了从单机单库到主从架构,再到分库分表的三个阶段。 1. **单机单库**:早期简单的应用,所有数据存储在一个MySQL实例中。随着数据量和读写操作的增加,单机难以承受,且一旦服务器故障,...
MySQL分库分表是数据库架构设计中用于处理大规模数据量以及高并发请求的一种技术手段。通过将数据拆分到不同的数据库服务器中,能够有效降低单个数据库的负载,提高系统的扩展性和性能。Python作为一种流行的编程...
【MySQL分表查询】在大型数据库系统中,随着数据量的不断增长,单表的数据规模可能会变得非常庞大,导致查询效率下降,系统性能受到影响。此时,分表技术就显得尤为重要。MySQL提供了多种分表策略,如哈希分表、范围...
本文将深入探讨基于Node.js实现的MySQL分表分库中间件,它在分布式集群环境中起到至关重要的作用。 首先,Node.js是一种流行的JavaScript运行环境,它允许开发人员使用JavaScript进行服务器端编程。Node.js的异步非...
本篇文章将深入探讨"Python与MySQL分表分库实战"这一主题,帮助你理解如何有效地利用这两种技术来优化数据库性能和处理大数据。 首先,我们需要理解“分表分库”这一概念。随着数据量的增长,单一数据库可能会面临...
MySQL 分库分表查询工具——Shard 在大型的互联网应用中,数据库的性能瓶颈往往成为系统扩展性的关键因素。为了应对高并发、大数据量的挑战,MySQL 数据库的分库分表策略被广泛采用。分库是将数据分散到多个独立的...
MySQL 分表分库 Demo MySQL 分表分库是指将大型数据库表分割成多个小表,以提高数据库的性能和可扩展性。随着业务数据的增长,数据库表中的数据不断增加,如果不加以控制,数据库的性能将会下降,影响业务的发展。 ...
标题中的“mycat+mysql+jdbc实现根据手机号尾号分库分表存储”涉及的是分布式数据库中间件Mycat与MySQL数据库以及Java JDBC接口的结合使用。Mycat是一款开源的分布式数据库系统,用于解决大数据量、高并发的场景下的...
文件`mysql分表创建.sql`很可能包含了创建分表的SQL脚本,如创建新表、插入数据、设置分区等操作。具体操作时,应确保理解分表策略,合理选择分片键,避免数据热点,并测试分表后的查询性能。 总之,MySQL分表是...
Mycat是一款开源的分布式数据库系统,用于实现MySQL的分库分表功能,提高数据库的处理能力。在集群环境中,Mycat部署在两台服务器(mycat-01和mycat-02)上,配置包括: 1. 安装Mycat:下载Mycat的Linux版本并解压,...
MySQL分表和分区最佳攻略 word版本,
Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现分库分表+读写分离 Sharding-JDBC是阿里巴巴开源的关系型数据库中间件,提供了数据库分库分表、读写分离、数据库路由等功能。本教程将指导读者使用Sharding-...
Python后端运维工程师的可靠参考书,重点介绍如何优化mysql数据库性能。
【标题】"shardingSpringbootDemo-master-分库分表+读写分离.zip" 提供的是一个基于Sharding-JDBC的Spring Boot应用示例,它实现了数据库的分库分表和读写分离功能。Sharding-JDBC是阿里巴巴开源的一个轻量级Java...
- 分表情况,2:日期分表,按照目标表里面的记录日期的字段,按照日期【日、周、月、年】拆分成多个表【本代码仅考虑unix时间戳来分表,其它不支持,您可以自己思考,自己修改代码】 - 注意,支持【子表】,填入...
关于mysql的分表技术实现方法。以及分表设计, 及简单的代码实例。