MySQL之-分库分表的技巧分享
技术百科
黄舟
发布时间:2017-03-11
浏览: 次 分表是分散数据库压力的好方法。
分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库。
当然,首先要知道什么情况下,才需要分表。个人觉得单表记录条数达到百万到千万级别时就要使用分表了。
1,分表的分类
1>纵向分表
将本来可以在同一个表的内容,人为划分为多个表。(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的。)
分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的)
案例:
对于一个博客系统,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据。所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理。
这样纵向分表后:
首先存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。
其次,对冷数据进行更多的从库配置,因为更多的操作时查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。
其实,对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库。或者mongodb 一类的nosql 数据库,这里只是举例,就先不说这个。
2>横向分表
字面意思,就可以看出来,是把大的表结构,横向切割为同样结构的不同表,如,用户信息表,user_1,user_2 等。表结构是完全一样,但是,根据某些特定的规则来划分的表,如根据用户ID来取模划分。
分表理由:根据数据量的规模来划分,保证单表的容量不会太大,从而来保证单表的查询等处理能力。
案例:同上面的例子,博客系统。当博客的量达到很大时候,就应该采取横向分割来降低每个单表的压力,来提升性能。例如博客的冷数据表,假如分为100个表,当同时有100万个用户在浏览时
,如果是单表的话,会进行100万次请求,而现在分表后,就可能是每个表进行1万个数据的请求(因为,不可能绝对的平均,只是假设),这样压力就降低了很多很多。
数据库的复制能解决访问问题,并不能解决大规模的并发写入问题,要解决这个问题就要考虑mysql数据切分了
数据切分,顾名思义,就是数据分散,将一台主机上的数据分摊到多台,减轻单台主机的负载压力,有两种切分方式,一种是分库,即按照业务模块分多个库,每个库中的表不一样,还有一种就是分表,按照一定的业务规则或者逻辑将数据拆分到不同的主机上,每个主机上的表是一样的,这个有点类似于Oracle的表分区。
分库又叫垂直分区,这种方式实现起来比较简单,重要的是对业务要细化,分库时候要想清楚各个模块业务之间的交互情况,避免将来写程序时出现过多的跨库操作。
分表又叫水平分区,这种方式实现起来就比垂直分区复杂些,但是它能解决垂直分区所不能解决的问题,即单张表的访问及写入很频繁,这时候就可以根据一定的业务规则(PS:如互联网BBS论坛的会员等级概念:根据会员等级来分表)来分表,这样就能减轻单表压力,并且还能解决各个模块的之间的频繁交互问题。
分库的优点是:实现简单,库与库之间界限分明,便于维护,缺点是不利于频繁跨库操作,单表数据量大的问题解决不了。
分表的优点是:能解决分库的不足点,但是缺点却恰恰是分库的优点,分表实现起来比较复杂,特别是分表规则的划分,程序的编写,以及后期的数据库拆分移植维护。
实际应用中,一般互联网企业的路线都是先分库再分表,两者结合使用,取长补短,这样发挥了mysql扩展的最大优势,但是缺点是架构很大,很复杂,应用程序的编写也比较复杂。
# 互联网
# 博客
# 的是
# 都是
# 把它
# 多个
# 万个
# 就可以
# mysql
# 切分
# 又叫
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么开启上帝模式_创建Windows 1
- Windows 10怎么录屏_Windows 10
- Python装饰器复用技巧_通用能力解析【教程】
- C#如何使用Channel C#通道实现异步通信
- c++如何实现一个高性能的环形队列(Ring Bu
- 如何使用Golang实现负载均衡_分发请求到多个服
- Win11怎么恢复误删照片_Win11数据恢复工具
- c++ std::future和std::prom
- C++如何使用std::async进行异步编程?(
- c++的位运算怎么用 与、或、异或、移位操作详解【
- Win10如何备份注册表_Win10注册表备份步骤
- Win11如何设置开机问候语 Win11修改登录界
- Win11如何设置计划任务 Win11定时执行程序
- Win10怎么限制单程序CPU占用上限_Win10
- Win11怎么设置多显示器任务栏 Win11扩展任
- 如何使用Golang处理静态文件缓存_提高页面加载
- php删除数据怎么软删除_添加is_del字段标记
- Win11怎么检查TPM2.0模块_Windows
- Win10怎样卸载DockerDesktop_Wi
- php本地部署后session无法保存_sessi
- 如何在Golang中处理通道发送接收错误_防止阻塞
- Win11怎么开启游戏模式_Windows11优化
- PHP 中如何在函数内持久化修改引用变量的指向
- Linux怎么查找死循环进程_Linux系统负载分
- Win10电脑C盘红了怎么清理_Windows10
- Win10如何卸载自带Edge_Win10彻底卸载
- Python与Docker容器化部署实战_镜像构建
- Python装饰器设计思路_功能增强机制说明【指导
- Win11怎么关闭自动调节亮度 Win11禁用内容
- Win10系统更新错误0x80240034怎么办
- Win11怎么关闭用户账户控制UAC_Window
- Linux如何安装JDK11_Linux环境变量配
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- 如何优化Golang Web性能_Golang H
- 如何在Golang中捕获HTTP服务器错误_Gol
- Python邮件系统自动化教程_批量发送解析与模板
- PHP 中如何在函数内持久修改引用变量所指向的目标
- Mac系统更新下载慢或失败怎么办_解决macOS升
- Win11怎么开启游戏模式_Win11优化游戏帧数
- Python函数参数高级用法_默认值与可变参数解析
- Win11怎么关闭应用权限_Windows11相机
- Win11如何关闭游戏模式 Win11禁用Xbox
- 如何高效获取循环末次生成的 NumPy 数组最后一
- Windows怎样拦截QQ浏览器广告_Window
- 如何使用Golang sync.Map实现并发安全
- php485返回空数组怎么回事_php485数据接
- Win11怎么关闭VBS安全性_Windows11
- Win11怎么清理C盘OneDrive缓存_Win
- Python大文件处理策略_内存优化说明【指导】

QQ客服