一、Mysql分表的原因

1、当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。

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

这里只讨论最简单的分表规则取模

假如我们需要把用户表分为100张表 

user进行水平的切分,产生两个表结构完全一样的user_1,user_2等表,user_1 + user_2 + …的数据刚好是一份完整的数据。

 
1)我们采用最简单的分表方案  取模
我们根据用户的id来模100
比如 用户id为1000156    模上100  为56  那添加数据或者读取数据的时候  都是在user_56这个表操作
 
下面是分表的脚本
#!/bin/sh

# dev | idc
dbenv=dev if [ "${dbenv}" = "dev" ]; then
mysql_user=root
mysql_pass=root
mysql_host=
fi
if [ "${dbenv}" = "idc" ]; then
mysql_user=root
mysql_pass=root
mysql_host="-h 10.10.10.10"
fi mysql_cmd="mysql -u${mysql_user} -p${mysql_pass} ${mysql_host} --default-character-set=utf8" for i in {..}
do
${mysql_cmd} <<EOF use md_mydatabasel; create table t_user_$i
(
f_uin bigint() NOT NULL DEFAULT '',
f_name varchar() NOT NULL DEFAULT '',
PRIMARY KEY (f_uin)
)ENGINE=InnoDB DEFAULT CHARSET=utf8; EOF done

下面是删除表的脚本

 
#!/bin/sh

# dev | idc
dbenv=dev if [ "${dbenv}" = "dev" ]; then
mysql_user=root
mysql_pass=root
mysql_host=
fi
if [ "${dbenv}" = "idc" ]; then
mysql_user=midea
mysql_pass=MD_midea
mysql_host="-h 10.10.10.10"
fi mysql_cmd="mysql -u${mysql_user} -p${mysql_pass} ${mysql_host} --default-character-set=utf8" for i in {..}
do
${mysql_cmd} <<EOF use md_mydatabasel; drop table t_user_$i; EOF
done
 
2)每张表需要保证 用户的id为全局唯一的
有个简单的解决方案是  
在数据库里面 建立一个表  只有一个字段 是专门用来取号码的
即每次  需要创建一个新用户,则从这个表里面取一个号码 同时让这个号码增加一个
这个来保证每个用户的id都是全局唯一的
CREATE TABLE t_global_number (
f_global_id bigint(20) NOT NULL,
PRIMARY KEY (f_global_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
3)关于数据读取
我们尽量让请求不要直接去查询数据库
我们可以每次查到数据就放到redis的缓存里面。
如果数据没改变则一直用缓存
一旦数据改变了就 删除缓存
这样可以减轻数据库的查询负担
 
 
 
三、分库分表产生的问题,及注意事项 
1.   分库分表维度的问题 
假如用户购买了商品,需要将交易记录保存取来,如果按照用户的纬度分表,则每个用户的交易记录都保存在同一表中,所以很快很方便的查找到某用户的购买情况,但是某商品被购买的情况则很有可能分布在多张表中,查找起来比较麻烦。反之,按照商品维度分表,可以很方便的查找到此商品的购买情况,但要查找到买人的交易记录比较麻烦。

所以常见的解决方式有: 
     a.通过扫表的方式解决,此方法基本不可能,效率太低了。 
     b.记录两份数据,一份按照用户纬度分表,一份按照商品维度分表。 
     c.通过搜索引擎解决,但如果实时性要求很高,又得关系到实时搜索。

2.   联合查询的问题 
联合查询基本不可能,因为关联的表有可能不在同一数据库中。

3.   避免跨库事务 
避免在一个事务中修改db0中的表的时候同时修改db1中的表,一个是操作起来更复杂,效率也会有一定影响。

4.   尽量把同一组数据放到同一DB服务器上 
例如将卖家a的商品和交易信息都放到db0中,当db1挂了的时候,卖家a相关的东西可以正常使用。也就是说避免数据库中的数据依赖另一数据库中的数据。 

一、mysql分表简单介绍的更多相关文章

  1. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  2. Mysql分表和分区的区别、分库分表介绍与区别(转)

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  3. mysql分表场景分析与简单分表操作

    为什么要分表 首先要知道什么情况下,才需要分表个人觉得单表记录条数达到百万到千万级别时就要使用分表了,分表的目的就在于此,减小数据库的负担,缩短查询时间. 表分割有两种方式: 1水平分割:根据一列或多 ...

  4. mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

  5. 【mysql】mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

  6. mysql分表,分区的区别和联系

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  7. Mysql分表和分区的区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  8. 浅谈MySQL分表

    关于分表:顾名思义就是一张数据量很大的表拆分成几个表分别进行存储. 我们先来大概了解以下一个数据库执行SQL的过程: 接收到SQL --> 放入SQL执行队列 --> 使用分析器分解SQL ...

  9. MYSQL分表与分区

    什么是分表分区分表分区的区别实现方式上数据处理上提高性能上实现的难易度上mysql分表和分区的联系如何分区概述分区技术支持分区类型及举例注意应用场景示例订单表比预想中扩张速度快坑爹的日志表每半月一个分 ...

随机推荐

  1. javascript算法挑战

    1.翻转字符串算法挑战: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 function reverseString(str) ...

  2. NetAnalyzer笔记 之 十 通过邮件方式打造自己的bug反馈模块(C#)

    在软件发布后,有个好的反馈系统,对我们后续的软件开发有着至关重要的影响,现今软件异常反馈功能模块已经成了软件中重要的组成部分了.但是对于个人软件开发者,尤其是对于我这种贫民个人软件开发者却是个不小的难 ...

  3. Could not Build module ImageIO

    错误提示:Could not Build module ImageIO: 原因:修改了XCode API 源文件 措施:从一个干净的未曾修改过的XCode中拷贝一份相应的文件添加到发生错误的XCode ...

  4. 贪心-poj-3040-Allowance

    题目链接: http://poj.org/problem?id=3040 题目意思: 有n种(n<=20)面额的硬币,每种硬币面值能整除比它大的面值.给一个c,告诉每种硬币的面值和数量,求最多能 ...

  5. 经常使用的自己定义UI组件- 一:TimeView

     近期做蛋疼的机顶盒项目,以后遇到哪些经常使用的组件,记录于此. 反编译 youku视频TV偷来的..也希望各位童鞋多学习别人的代码,为己所用. 当然还有其它的办法,比方监听系统发出的广播等等.等 ...

  6. -bash: mysql: command not found 解决办法 (转)

    root@DB-02 ~]# mysql -u root-bash: mysql: command not found 原因:这是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下 ...

  7. [Linux 小技巧] Ubuntu 14.04 下编译、安装、配置最新开发版 GoldenDict

    1. 背景介绍 GoldenDict 是一款非常优秀的跨平台电子词典软件,支持 StarDict.Babylon 等多种词典.其 PC 版基于 Qt 编写,完全免费.开源且没有广告.GoldenDic ...

  8. IO-File 文件 目录 基本操作 递归 遍历

    创建和删除 //创建文件 File file1 = new File("不存在的文件.txt");//注意,这一步并没有创建文件,只是把磁盘中的文件封装成了一个对象 System. ...

  9. Sherpa | Complete Navigation System 介绍与教材

    这里的夏尔巴人在iPad上使用的一种新的视频. 正如其名称所暗示的,夏尔巴人是所有您的导航需求的整体解决方案. 夏尔巴人带来了每个接口的三个主要的导航元素结合在一起 - 导航栏,侧边栏和页脚粘. 每一 ...

  10. FANTASY:In which way do you think the world will end?

    In which way do you think the world will end? The moment you are reading my essay, you are somehow c ...