首页 数据库 mysql分表简单介绍

mysql分表简单介绍

一、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=fiif [ "${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 {1..100}do
    ${mysql_cmd} <<EOF
 
    use 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;
 
 
 
EOF 
done
下面是删除表的脚本 #!/bin/sh
 # dev | idc
dbenv=dev 
if [ "${dbenv}" = "dev" ]; then
    mysql_user=root
    mysql_pass=root
    mysql_host=fiif [ "${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 {1..100}do
    ${mysql_cmd} <<EOF
 
    use md_mydatabasel;
     
    drop table t_user_$i;
 
EOFdone
 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、当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想..

为您推荐

服务器安装数据库MySQL8.0版本,打包导入到MySQL5.6失败的结局方式

最近数据库升级为mysql8.0,在使用过程中发现一些问题,首先mysql8.0有很多新特性,对服务器配置要求较高,所有就考虑把数据库版本切换到MySQL5.6,经过多出测试处理发现在8.0数据库打包的数据导入到5.6总是报错,或..

MySQL查询建表规范

因为之前一直再查找一些比较好的数据库规范,以方便在开发时连接 MySQL 进行查询/建表的时候,能根据规范来执行,达到提高 查询速度 / 执行 SQL 的性能 和提升 MySQL 的整体性能, 这里主要是存放一些比较好的一些数..

必须掌握的MySQL优化指南(2)

4|0表分区MySQL 在 5.1 版引入的分区是一种简单的水平拆分,用户需要在建表的时候加上分区参数,对应用是透明的无需修改代码。对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实现分区的代码实..

MySQL创建用户与授权

一, 创建用户: 命令:CREATE USER'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, ..

必须掌握的MySQL优化指南(1)

1.单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度。一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时..

一个简单的 C# 异步日志记录器

Clearcove.Logging是一个非常简单的日志库,旨在通过直接许可条款满足大多数日志记录需求。介绍我知道你在想什么——代码世界真的需要另一个日志库吗?如果你在.NET中寻找一个日志库,那么你有很多选择。有NLog,Log..

Mysql查询的一些操作(查表名,查字段名,查当月,查一周,查当天)

查询数据库中所有表名select table_name from information_schema.tables where table_schema='tools' and table_type='base table';查询指定数据库中指定表的所有字段名column_nameselect column_n..

一个简单的大转盘抽奖程序(附.NetCore Demo源码)

最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql1.前端实现:前端用的是基于开源的lottery,其中有些改动的,使得前端可以自适应pc端..

MySQL查看、修改字符集及Collation

前言在使用MySQL的过程中,可能会出现初始设计使用的字符集或Collation不符合当前需求的情况。如使用utf8的表(MySQL中的utf8即utf8mb3)要支持emoji,而utf8mb3不支持emoji(emoji需要4个字节,而utf8mb3最长只支持..

MySQL SQL调优之索引

本篇记录MySQL的索引知识学习笔记,也方便自己以后查找复习一、索引的概念MySQL官方给出的索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构。所以说索引就是排好序的快速查找数据结构二、索引分类MySQL的索..

mysql随机获取一条或者多条数据

语句一:select * from users order by rand() LIMIT 1MYSQL手册里面针对RAND()的提示大概意思就是,在 ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描,导致效率相当相当的低,效率不行,切..

Mysql子查询

子查询出现在select语句中的select语句,称为子查询或内查询。外部的select查询语句,称为主查询或外查询。子查询分类按结果集的行列数不同分为4种标量子查询(结果集只有一行一列)列子查询(结果集只有一列多行)..

MySQL批量插入的分析

1、背景我们在工作中基本都会碰到批量插入数据到DB的情况,这个时候我们就需要根据不同的情况选择不同的策略。只要了解sql,就应该知道,向table中插入数据的命令,至少有insert和replace这两种,使用哪一种命令,和..

Mysql查询一段时间内的数据

select * from wap_content where week(created_at) = week(now)如果你要严格要求是某一年的,那可以这样查询一天:select * from table where to_days(column_time) = to_days(now());select * from table where da..

简单优雅的Java ORM

Java的ORM框架有很多,但由于Java语言的限制大部分都不够优雅也不够简单,所以作者只能另辟蹊径造轮子了。照旧先看示例代码了解个大概,然后再解释实现原理。一、ORM示例Insertpublic CompletableFuture<Void> inser..

MySQL 5.x和MySQL 8.x数据库的区别

MySQL 是开源关系型数据库的代表,广泛应用于不同规模的 Web 和企业应用中。从 MySQL 5.x 到 MySQL 8.x 的升级带来了大量功能改进和性能提升。为了帮助大家更直观地理解两者的区别,本文将通过详细介绍并结合实际的 ..

宝塔里mysql停止了自动启用脚本

mysql突然停止的原因有多种,这里不列举,可以排查具体原因。如果停止后,还可以手工正常启用mysql,那可以考虑把shell脚本添加到宝塔的计划任务里,定时每隔几分钟检测一次,让mysql自动检测停止后立马启用。ps=`ps..

Dapper使用教程

假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM。Dapper的优势: 1、Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll. 2、Dapper很快。Dapper的速度..

MySQL如何建数据库

MySQL是一款非常流行的关系型数据库管理系统。无论是在企业还是个人项目中,都经常使用MySQL数据库。在使用MySQL之前,需要先创建一个数据库。本文将介绍如何建立MySQL数据库。一、安装MySQL在开始建立MySQL数据库之..

mysql怎么随机查询数据

MySQL是一种广泛使用的关系型数据库管理系统,在进行数据查询时,随机查询数据是一项很有用的技能。以下是一些方法和技巧,可以帮助你使用MySQL在数据中进行随机查询。方法一:使用RAND()函数进行随机排序RAND()函数..

发表回复

返回顶部