百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Mysql分区表原理-快速造100万用户数据

wxin55 2024-11-14 18:43 10 浏览 0 评论


分区表的原理

数据库表分区把一个大的物理表分成若干个小的物理表,并使得这些小物理表在逻辑上可以被当成一张表来使用。

Select操作:查询的条件一定要有分区的字段;

Insert操作和delete操作:分区层先打开所有的底层表,确认那个分区接收,再将记录写入底层表;

Update操作:分区层先打开所有的底层表,确认那个分区接收,将数据拿出更新,然后确认是哪个分区,将数据写入,原数据删除操作;

虽然每一个操作很多会先打开锁住所有的底层表,但这并不代表在处理过程中是锁住全表的。如果存储引擎能够自己实现行级锁(innoDB),则会在分区层释放对应的表锁,所以建议使用类似innodb的引擎;


分区类型

  1. RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
  2. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
  3. HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
  4. KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。


快速造100万用户数据

创建表

 CREATE TABLE `app_user`(
 `id` INT  NOT NULL AUTO_INCREMENT COMMENT '主键',
 `name` VARCHAR(50) DEFAULT '' COMMENT '用户名称',
 `email` VARCHAR(50) NOT NULL COMMENT '邮箱',
 `phone` VARCHAR(20) DEFAULT '' COMMENT '手机号',
 `gender` TINYINT DEFAULT '0' COMMENT '性别(0-男 :1-女)',
 `password` VARCHAR(100) NOT NULL COMMENT '密码',
 `age` TINYINT DEFAULT '0' COMMENT '年龄',
 `create_time` DATETIME DEFAULT NOW(),
 `update_time` DATETIME DEFAULT NOW(),
 PRIMARY KEY (`id`)
 )ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT='app用户信息表'


创建函数


 SET GLOBAL log_bin_trust_function_creators=TRUE; -- 创建函数一定要写这个
 DELIMITER $   -- 写函数之前必须要写,该标志
 
 CREATE FUNCTION mock_user_data()-- 创建函数(方法)
 RETURNS INT -- 返回类型
 BEGIN-- 函数方法体开始
 DECLARE num INT DEFAULT 1000000; -- 定义一个变量num为int类型。默认值为100 0000
 DECLARE i INT DEFAULT 0;
 
 WHILE i < num DO -- 循环条件
  INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)
  VALUES(CONCAT('用户',i),'121313@qq.com',CONCAT('18',FLOOR(RAND() * ((999999999 - 100000000) + 1000000000))),FLOOR(RAND()  *  2),UUID(),FLOOR(RAND()  *  100));
 SET i = i + 1;-- i自增
 END WHILE;-- 循环结束
 RETURN i;
 END; 


调用函数

 SELECT mock_user_data();


查询创建结果

 SELECT id, name, email, phone, gender, password, age, create_time, update_time  FROM app_user;
 
 -- 查询总数
 SELECT COUNT(id) FROM app_user;


Mysql分区实验

HASH 分区

 ALTER  table app_user PARTITION by hash(id) PARTITIONS 5;


每个分区数据量大概是40万


查询效率对照

使用非主键字段查询

 explain select * from app_user au where au.phone = '181873386579';


使用主键查询

 explain select * from app_user au where au.id = 1000000;

使用主键查询type是const,rows 1条,非主键 type是ALL,rows1960365条

explain解释:

select_type:表示 SELECT 的类型。

常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)

PRIMARY(主查询,即外层的查询)

UNION(UNION 中的第二个或者后面的查询语句)

SUBQUERY(子查询中的第一个 SELECT)等。

table:输出结果集的表。

type:表示表的连接类型,性能由好到差的连接类型如下

1.system(表中仅有一行,即常量表)

2.const(单表中最多有一个匹配行,例如 primary key 或者 unique index)

3.eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用primary key或者unique index)

4.ref(与eq_ref类似,区别在于不是使用primary key 或者 unique index,而是使用普通的索引)

5.ref_or_null(与 ref 类似,区别在于条件中包含对 NULL 的查询)

6.index_merge(索引合并优化)

7.unique_subquery(in的后面是一个查询主键字段的子查询)

8.index_subquery(与 unique_subquery 类似,区别在于 in 的后面是查询非唯一索引字段的子查询)

9.range(单表中的范围查询)

10.index(对于前面的每一行,都通过查询索引来得到数据)

11.all(对于前面的每一行,都通过全表扫描来得到数据)。

possible_keys:表示查询时,可能使用的索引。

key:表示实际使用的索引。

key_len:索引字段的长度。

rows:扫描行的数量。

Extra:执行情况的说明和描述。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: