当前位置: 首页 > news >正文

mysql分表经验总结

一、为什么要分表?

当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。
根据个人经验,mysql执行一个sql的过程如下:
1、接收到sql;
2、把sql放到排队队列中;
3、执行sql;
4、返回执行结果。
在这个执行过程中最花时间在什么地方呢?第一,是排队等待的时间,第二,sql的执行时间。其实这二个是一回事,等待的同时,肯定有sql在执行。所以我们要缩短sql的执行时间。

mysql中有一种机制是表锁定和行锁定,为什么要出现这种机制,是为了保证数据的完整性,我举个例子来说吧,如果有二个sql都要修改同一张表的同一条数据,这个时候怎么办呢,是不是二个sql都可以同时修改这条数据呢?很显然mysql对这种情况的处理是,一种是表锁定(myisam存储引擎),一个是行锁定(innodb存储引擎)。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。如果数据太多,一次执行的时间太长,等待的时间就越长,这也是我们为什么要分表的原因。

二、分表方案

具体的分表方案有很多,这里只介绍我使用的方案。车联网项目里,车辆轨迹的数据很大,所以将其分为若干个表,那事先建100个这样的表,trajectory_00,trajectory_01,trajectory_02……….trajectory_98,trajectory_99.然后根据GPS设备的ID来判断这个设备的轨迹数据放到哪张表里面(把设备id和这100张表建立关联,使得所有设备平均分配到100张表里,我用的是java里的hashcode),然后写个方法根据传入的设备id获得表名。

/**
* 根据设备id获取表名
* @param deviceid
* @return
*/
public static String getTableByDeviceId(String deviceid) {
return "trajectory_"+(Math.abs(deviceid.hashCode())+"").substring(0, 2);
}

优点:避免一张表出现几百万条数据,缩短了一条sql的执行时间。
缺点:①当一种规则确定时,打破这条规则会很麻烦,上面的例子中我用的hash算法是crc32,如果我现在不想用这个算法了,改用md5后,会使同一个设备的数据被存储到不同的表中,这样数据乱套了。扩展性很差。
②当要同时获取两个处在不同表里的设备数据时,要union一下,稍微麻烦点。

三、总结一下
现在项目运行下来,平均每个轨迹表trajectory有100W条数据,每张表里大约有100个设备,现在执行sql查询体验良好。其实优先应该考虑的优化方案是建合适的索引,其次才是分表,或者分库。

做什么事都有一个度,超过个度就过变得很差,不要一味的分表,分出来1000表,mysql的存储归根到底还以文件的形势存在硬盘上面,一张表对应三个文件,1000个分表就是对应3000个文件,这样检索起来也会变的很慢。

其实上面介绍的是水平分表的实施方法,还存在另一种方法叫做:垂直分表。

相关文章:

  • Lind.DDD.Messaging框架通讯组件介绍
  • 未完成.队列
  • vuex的使用
  • 21、PHP和python/JAVA比,哪个更好学?
  • word 2007每次打开总出现setup error
  • C# WinForm开发系列 - GDI+【转】
  • 【自用】 Kotlin 创建自己的对话框
  • 从antlr扯淡到一点点编译原理
  • 用Canvas画一棵二叉树
  • webpack+react环境搭建与hello world
  • iOS 实现UINavigation全屏滑动返回(一)
  • c++那些事儿4 0 多态
  • 1.Node.js
  • 使用Doxygen生成C#帮助文档
  • [喵咪大数据]Hadoop集群模式
  • 【译】JS基础算法脚本:字符串结尾
  • Android开源项目规范总结
  • DataBase in Android
  • Java多态
  • Just for fun——迅速写完快速排序
  • Linux下的乱码问题
  • Meteor的表单提交:Form
  • python_bomb----数据类型总结
  • XML已死 ?
  • 构造函数(constructor)与原型链(prototype)关系
  • 理解在java “”i=i++;”所发生的事情
  • 排序算法之--选择排序
  • 浅谈Golang中select的用法
  • 数据可视化之 Sankey 桑基图的实现
  • 推荐一个React的管理后台框架
  • mysql面试题分组并合并列
  • ​第20课 在Android Native开发中加入新的C++类
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)Google的Objective-C编码规范
  • **PHP分步表单提交思路(分页表单提交)
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core 成都线下面基会拉开序幕
  • .net Signalr 使用笔记
  • .net wcf memory gates checking failed
  • .net 按比例显示图片的缩略图
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .net的socket示例
  • .NET开发者必备的11款免费工具
  • .net生成的类,跨工程调用显示注释
  • /bin/rm: 参数列表过长"的解决办法
  • [16/N]论得趣
  • [bug总结]: Feign调用GET请求找不到请求体实体类