电玩城打鱼捕鱼-专业24小时上下分

什么是数据库分表技术,分表处理设计思想和实现

六月 13th, 2019  |  电玩城上下分数据库

Mysql分表技术是Mysql数据库中的关键技术,下文对Mysql分表的概念及使用作了详细的介绍,如果您对此感兴趣的话,不妨一看。

什么是数据库分表技术

本文转载:

首先我们需要了解为什么要进行Mysql分表,Mysql分表的好处是什么。我们先来大概了解以下一个数据库执行SQL的过程:
接收到SQL –> 放入SQL执行队列 –> 使用分析器分解SQL –>
按照分析结果进行数据的提取或者修改 –> 返回处理结果

 

一、概述

当然,这个流程图不一定正确,这只是我自己主观意识上这么我认为。那么这个处理过程当中,最容易出现问题的是什么?就是说,如果前一个SQL没有执行完毕的话,后面的SQL是不会执行的,因为为了保证数据的完整性,必须对数据表文件进行锁定,包括共享锁和独享锁两种锁定。共享锁是在锁定的期间,其它线程也可以访问这个数据文件,但是不允许修改操作,相应的,独享锁就是整个文件就是归一个线程所有,其它线程无法访问这个数据文件。一般MySQL中最快的存储引擎MyISAM,它是基于表锁定的,就是说如果一锁定的话,那么整个数据文件外部都无法访问,必须等前一个操作完成后,才能接收下一个操作,那么在这个前一个操作没有执行完成,后一个操作等待在队列里无法执行的情况叫做阻塞,一般我们通俗意义上叫做“锁表”。

一、概述

分表是个目前算是比较炒的比较流行的概念,特别是在大负载的情况下,分表是一个良好分散数据库压力的好方法。

锁表直接导致的后果是什么?就是大量的SQL无法立即执行,必须等队列前面的SQL全部执行完毕才能继续执行。这个无法执行的SQL就会导致没有结果,或者延迟严重,影响用户体验。

 

首先要了解为什么要分表,分表的好处是什么。我们先来大概了解以下一个数据库执行SQL的过程:

特别是对于一些使用比较频繁的表,比如SNS系统中的用户信息表、论坛系统中的帖子表等等,都是访问量大很大的表,为了保证数据的快速提取返回给用户,必须使用一些处理方式来解决这个问题,这个就是我今天要聊到的分表技术。

分表是个目前算是比较炒的比较流行的概念,特别是在大负载的情况下,分表是一个良好分散数据库压力的好方法。

接收到SQL –> 放入SQL执行队列 –> 使用分析器分解SQL –>
按照分析结果进行数据的提取或者修改 –> 返回处理结果

Mysql分表技术顾名思义,就是把若干个存储相同类型数据的表分成几个表分表存储,在提取数据的时候,不同的用户访问不同的表,互不冲突,减少锁表的几率。比如,目前保存用户分表有两个表,一个是user_1表,还有一个是
user_2 表,两个表保存了不同的用户信息,user_1
保存了前10万的用户信息,user_2保存了后10万名用户的信息,现在如果同时查询用户
heiyeluren1 和 heiyeluren2
这个两个用户,那么就是Mysql分表从不同的表提取出来,减少锁表的可能。
 

 

当然,这个流程图不一定正确,这只是我自己主观意识上这么我认为。那么这个处理过程当中,最容易出现问题的是什么?就是说,如果前一个SQL没
有执行完毕的话,后面的SQL是不会执行的,因为为了保证数据的完整性,必须对数据表文件进行锁定,包括共享锁和独享锁两种锁定。共享锁是在锁定的期间,
其它线程也可以访问这个数据文件,但是不允许修改操作,相应的,独享锁就是整个文件就是归一个线程所有,其它线程无法访问这个数据文件。一般MySQL中
最快的存储引擎MyISAM,它是基于表锁定的,就是说如果一锁定的话,那么整个数据文件外部都无法访问,必须等前一个操作完成后,才能接收下一个操作,
那么在这个前一个操作没有执行完成,后一个操作等待在队列里无法执行的情况叫做阻塞,一般我们通俗意义上叫做“锁表”。

MySQL服务器的内部锁定

首先要了解为什么要分表,分表的好处是什么。我们先来大概了解以下一个数据库执行SQL的过程:

锁表直接导致的后果是什么?就是大量的SQL无法立即执行,必须等队列前面的SQL全部执行完毕才能继续执行。这个无法执行的SQL就会导致没有结果,或者延迟严重,影响用户体验。

25条mysql和sql server区别

 

特别是对于一些使用比较频繁的表,比如SNS系统中的用户信息表、论坛系统中的帖子表等等,都是访问量大很大的表,为了保证数据的快速提取返回给用户,必须使用一些处理方式来解决这个问题,这个就是我今天要聊到的分表技术。

带您深入了解Mysql临时表

接收到SQL –> 放入SQL执行队列 –> 使用分析器分解SQL –>
按照分析结果进行数据的提取或者修改 –> 返回处理结果

分表技术顾名思义,就是把若干个存储相同类型数据的表分成几个表分表存储,在提取数据的时候,不同的用户访问不同的表,互不冲突,减少锁表的几
率。比如,目前保存用户分表有两个表,一个是user_1表,还有一个是 user_2
表,两个表保存了不同的用户信息,user_1
保存了前10万的用户信息,user_2保存了后10万名用户的信息,现在如果同时查询用户
heiyeluren1 和 heiyeluren2
这个两个用户,那么就是分表从不同的表提取出来,减少锁表的可能。

Mysql清空表的实现方法

 

我下面要讲述的两种分表方法我自己都没有实验过,不保证准确能用,只是提供一个设计思路。下面关于分表的例子我假设是在一个贴吧系统的基础上来进行处理和构建的。(如果没有用过贴吧的用户赶紧Google一下)

查看Mysql表结构的命令


然,这个流程图不一定正确,这只是我自己主观意识上这么我认为。那么这个处理过程当中,最容易出现问题的是什么?就是说,如果前一个SQL没有执行完毕的
话,后面的SQL是不会执行的,因为为了保证数据的完整性,必须对数据表文件进行锁定,包括共享锁和独享锁两种锁定。共享锁是在锁定的期间,其它线程也可
以访问这个数据文件,但是不允许修改操作,相应的,独享锁就是整个文件就是归一个线程所有,其它线程无法访问这个数据文件。一般MySQL中最快的存储引
擎MyISAM,它是基于表锁定的,就是说如果一锁定的话,那么整个数据文件外部都无法访问,必须等前一个操作完成后,才能接收下一个操作,那么在这个前
一个操作没有执行完成,后一个操作等待在队列里无法执行的情况叫做阻塞,一般我们通俗意义上叫做“锁表”。

二、基于基础表的分表处理

首先我们需要…

 

这个基于基础表的分表处理方式大致的思想就是:一个主要表,保存了所有的基本信息,如果某个项目需要找到它所存储的表,那么必须从这个基础表中
查找出对应的表名等项目,好直接访问这个表。如果觉得这个基础表速度不够快,可以完全把整个基础表保存在缓存或者内存中,方便有效的查询。

锁表直接导致的后果是什么?就是大量的SQL无法立即执行,必须等队列前面的SQL全部执行完毕才能继续执行。这个无法执行的SQL就会导致没有结果,或者延迟严重,影响用户体验。

我们基于贴吧的情况,构建假设如下的3张表:

 

  1. 贴吧版块表: 保存贴吧中版块的信息

  2. 贴吧主题表:保存贴吧中版块中的主题信息,用于浏览

  3. 贴吧回复表:保存主题的原始内容和回复内容

特别是对于一些使用比较频繁的表,比如SNS系统中的用户信息表、论坛系统中的帖子表等等,都是访问量大很大的表,为了保证数据的快速提取返回给用户,必须使用一些处理方式来解决这个问题,这个就是我今天要聊到的分表技术。

“贴吧版块表”包含如下字段:

 

版块ID      
board_id          int(10)


表技术顾名思义,就是把若干个存储相同类型数据的表分成几个表分表存储,在提取数据的时候,不同的用户访问不同的表,互不冲突,减少锁表的几率。比如,目
前保存用户分表有两个表,一个是user_1表,还有一个是 user_2
表,两个表保存了不同的用户信息,user_1
保存了前10万的用户信息,user_2保存了后10万名用户的信息,现在如果同时查询用户
heiyeluren1 和 heiyeluren2
这个两个用户,那么就是分表从不同的表提取出来,减少锁表的可能。

版块名称   
board_name      char(50)

 

子表ID      
table_id            smallint(5)

我下面要讲述的两种分表方法我自己都没有实验过,不保证准确能用,只是提供一个设计思路。下面关于分表的例子我假设是在一个贴吧系统的基础上来进行处理和构建的。(如果没有用过贴吧的用户赶紧Google一下)

产生时间   
created             datetime

 

“贴吧主题表”包含如下字段:

二、基于基础表的分表处理

主题ID          topic_id       
int(10)

 

主题名称        topic_name     char(255)


个基于基础表的分表处理方式大致的思想就是:一个主要表,保存了所有的基本信息,如果某个项目需要找到它所存储的表,那么必须从这个基础表中查找出对应的
表名等项目,好直接访问这个表。如果觉得这个基础表速度不够快,可以完全把整个基础表保存在缓存或者内存中,方便有效的查询。

版块ID          board_id         
int(10)

 

创建时间       created           datetime

我们基于贴吧的情况,构建假设如下的3张表:

“贴吧回复表”的字段如下:

  1. 贴吧版块表: 保存贴吧中版块的信息

  2. 贴吧主题表:保存贴吧中版块中的主题信息,用于浏览

  3. 贴吧回复表:保存主题的原始内容和回复内容

回复ID        reply_id          
int(10)

 

回复内容      reply_text        text

“贴吧版块表”包含如下字段:

主题ID        topic_id          
int(10)

版块ID      board_id          int(10)
版块名称   board_name      char(50)
子表ID      table_id            smallint(5)
产生时间   created             datetime
“贴吧主题表”包含如下字段:
主题ID         topic_id        int(10)
主题名称       topic_name     char(255)
版块ID         board_id          int(10)
创建时间      created           datetime
“贴吧回复表”的字段如下:
回复ID       reply_id           int(10)
回复内容     reply_text        text
主题 ID       topic_id           int(10)
版块ID       board_id         int(10)
创建时间     created            datetime

版块ID        board_id        
int(10)

 

创建时间      created            datetime

标签:,

Your Comments

近期评论

    功能


    网站地图xml地图