一、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=devif [ "${dbenv}" = "dev" ]; thenmysql_user=rootmysql_pass=rootmysql_host=
fi
if [ "${dbenv}" = "idc" ]; then mysql_user=rootmysql_pass=rootmysql_host="-h 10.10.10.10"
fimysql_cmd="mysql -u${mysql_user} -p${mysql_pass} ${mysql_host} --default-character-set=utf8"for i in {1..100}
do${mysql_cmd} <<EOFuse md_mydatabasel;create table t_user_$i(f_uin bigint(20) NOT NULL DEFAULT '0',f_name varchar(256) NOT NULL DEFAULT '',PRIMARY KEY (f_uin))ENGINE=InnoDB DEFAULT CHARSET=utf8;EOFdone

下面是删除表的脚本

#!/bin/sh# dev | idc
dbenv=devif [ "${dbenv}" = "dev" ]; thenmysql_user=rootmysql_pass=rootmysql_host=
fi
if [ "${dbenv}" = "idc" ]; then mysql_user=mideamysql_pass=MD_mideamysql_host="-h 10.10.10.10"
fimysql_cmd="mysql -u${mysql_user} -p${mysql_pass} ${mysql_host} --default-character-set=utf8"for i in {1..100}
do${mysql_cmd} <<EOFuse 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相关的东西可以正常使用。也就是说避免数据库中的数据依赖另一数据库中的数据。

转载于:https://www.cnblogs.com/ztteng/p/4429794.html

一、mysql分表简单介绍相关推荐

  1. MySQL分库分表简单介绍

    分库.分表 一.前言 二.分片(类似分库) 三.Scale Out/Scale Up 和 垂直切分/水平拆分 四.分表和分区 五.分表与分库 六.分区与分片区别 一.前言 数据库的数据量达到一定程度之 ...

  2. mysql 主表存hash和子表的名字_【mysql】mysql分表和表分区详解

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

  3. Mysql数据库的简单介绍

    在当今的大数据时代,数据库已成为必不可少的数据工具.什么是数据库呢,数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. MYSQL是目前最为流行的关系型数据库系统,关系型数据库系统 ...

  4. MySql 分表、分库、分片和分区

    MySql 分表.分库.分片和分区 转载:用sharding技术来扩展你的数据库(一)sharding 介绍 转载:MySQL架构方案 - Scale Out & Scale Up. 转载:  ...

  5. mysql分表技巧_MySQL分表操作的方法分析

    本节内容: mysql分表 一般来说,当数据库的数据超过了100w记录时就应该考虑分表或者分区了. 本文介绍下mysql分表的一些方法. 首先,需要想好到底分多少个表,前提当然是满足应用. 这里使用了 ...

  6. mysql 分表和分区_Mysql分表和分区的区别

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

  7. mysql 分表规则获取表名_mysql分表和表分区详解

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

  8. mysql分表规则(转)

    author:skate time:2013/05/14 Mysql分表准则 在大量使用mysql时,数据量大.高访问时,为了提高性能需要分表处理,简介下mysql分表的标准,后续会继续补充 环境: ...

  9. mysql分表那些事儿

    从前不太喜欢发博客,觉得太繁杂,感觉平时的工作开发就已经够忙的了,所以很多时候心里想写,但是行动不允许.最近因为工作也还轻松,因此有时间来整理一下自己之前用到过的和了解的一些东西.今天来说说mysql ...

最新文章

  1. windows十大必禁服务
  2. swift开源项目精选
  3. openstack 用nova API 指定 compute node 创建 instance
  4. Go变量地址值和指针的关系
  5. read write spinlock
  6. 百度SEO Rspod紫光网站模板建站之星
  7. c#调用c++ delegate callback
  8. 如何在今日头条上持续生产优质内容
  9. bzoj 3517: 翻硬币
  10. 安装paramiko的方法
  11. uchome登陆机制分析(一)
  12. 计算机远程控制安全吗,远程控制电脑安全吗?
  13. php数组匹配某一个元素的值
  14. r5 5600H 怎么样 相当于什么水平
  15. 数组里的字符串转换成数字或者把数字转换成字符串
  16. 如何在把微信公众号生成链接
  17. itest英语考试bug_iTEST爱考试手机客户端下载-iTEST爱考试官网appv5.1.1安卓版下载_飞翔下载...
  18. 计算三大变化,带来了哪些红利?
  19. Android 整合高德地图SDK实现 地图预览,定位,模拟导航
  20. cds大佬座谈会总结

热门文章

  1. Windows 7无法使用Telnet命令
  2. 动态代理机制之查看一个类或接口中有哪些方法
  3. 充分理解HP Flex-10和VMware的端口映射关系
  4. PowerShell 学习笔记——运行命令
  5. [译] 你不需要基于 CSS Grid 的栅格布局系统
  6. python命令行添加Tab键自动补全
  7. 走你!Github 开源整合
  8. [code]代码格式1
  9. 磁珠,电感,零欧电阻之间的区别
  10. Python多线程threading用法