(MySQL经验)之MySQL单表行数最好低于2000w

news2024/11/26 4:20:17

作为在后端开发,是不是经常听到过,mysql 单表最好不要超过 2000w,单表超过 2000w 就要考虑数据迁移了,表数据都要到 2000w ,查询速度变得贼慢。

1、建表操作

建一张表

CREATE TABLE person(
id int NOT NULL AUTO_INCREMENT PRIMARY KEY comment '主键',
person_id tinyint not null comment '用户id',
person_name VARCHAR(200) comment '用户名称',
gmt_create datetime comment '创建时间',
gmt_modified datetime comment '修改时间'
) comment '人员信息表';

插入一条数据

insert into person values(1,1,'user_1', NOW(), now());

利用 mysql 伪列 rownum 设置伪列起始点为 1

select (@i:=@i+1) as rownum, person_name from person, (select @i:=100) as init;
set @i=1;

运行下面的 sql,连续执行 20 次,就是 2 的 20 次方约等于 100w 的数据;执行 23 次就是 2 的 23 次方约等于 800w , 如此下去即可实现千万测试数据的插入,如果不想翻倍翻倍的增加数据,而是想少量,少量的增加,有个技巧,就是在 SQL 的后面增加 where 条件,如 id > 某一个值去控制增加的数据量即可。

insert into person(id, person_id, person_name, gmt_create, gmt_modified)
select @i:=@i+1,
left(rand()*10,10) as person_id,
concat('user_',@i%2048),
date_add(gmt_create,interval + @i*cast(rand()*100 as signed) SECOND),
date_add(date_add(gmt_modified,interval +@i*cast(rand()*100 as signed) SECOND), interval + cast(rand()*1000000 as signed) SECOND)
from person;

此处需要注意的是,也许你在执行到近 800w 或者 1000w 数据的时候,会报错:The total number of locks exceeds the lock table size,这是由于你的临时表内存设置的不够大,只需要扩大一下设置参数即可。

SET GLOBAL tmp_table_size =512*1024*1024;512M)
SET global innodb_buffer_pool_size= 1*1024*1024*1024 (1G);

先来看一组测试数据,这组数据是在 mysql8.0 的版本,并且是在我本机上,由于本机还跑着 idea , 浏览器等各种工具,所以并不是机器配置就是用于数据库配置,所以测试数据只限于参考。
在这里插入图片描述
看到这组数据似乎好像真的和标题对应,当数据达到 2000w 以后,查询时长急剧上升。

2、单表数量限是多少呢?

首先我们先想想数据库单表行数最大多大?

CREATE TABLE person(
id int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY comment '主键',
person_id tinyint not null comment '用户id',
person_name VARCHAR(200) comment '用户名称',
gmt_create datetime comment '创建时间',
gmt_modified datetime comment '修改时间'
) comment '人员信息表';

看看上面的建表 sql,id 是主键,本身就是唯一的,也就是说主键的大小可以限制表的上限,如果主键声明 int 大小,也就是 32 位,那么支持 2^32-1 ~~21 亿;如果是 bigint,那就是 2^62-1 ?(36893488147419103232),难以想象这个的多大了,一般还没有到这个限制之前,可能数据库已经爆满了!!

有人统计过,如果建表的时候,自增字段选择无符号的 bigint , 那么自增长最大值是 18446744073709551615,按照一秒新增一条记录的速度,大约什么时候能用完?

在这里插入图片描述

3、表空间

下面我们再来看看索引的结构,对了,我们下面讲内容都是基于 Innodb 引擎的,大家都知道 Innodb 的索引内部用的是 B+ 树

在这里插入图片描述

这张表数据,在硬盘上存储也是类似如此的,它实际是放在一个叫 person.ibd (innodb data)的文件中,也叫做表空间;虽然数据表中,他们看起来是一条连着一条,但是实际上在文件中它被分成很多小份的数据页,而且每一份都是 16K。

大概就像下面这样,当然这只是我们抽象出来的,在表空间中还有段、区、组等很多概念,但是我们需要跳出来看。对于什么事 B+树,可以参考另一篇文章即可。

在这里插入图片描述

4、总结

  1. MySQL 的表数据是以页的形式存放的,页在磁盘中不一定是连续的。
  2. 页的空间是 16K, 并不是所有的空间都是用来存放数据的,会有一些固定的信息,如,页头,页尾,页码,校验码等等。
  3. 在 B+ 树中,叶子节点和非叶子节点的数据结构是一样的,区别在于,叶子节点存放的是实际的行数据,而非叶子节点存放的是主键和页号。
  4. 索引结构不会影响单表最大行数,2kw 也只是推荐值,超过了这个值可能会导致 B + 树层级更高,影响查询性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/867760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DNSPod十问王强:小厂做大模型,套壳赚快钱?

本期嘉宾 王强 ZelinAI、考考创始人 王强,ZelinAI、考考创始人兼CEO。ZelinAI成立于2023年,零代码构建AI应用,大模型落地最后一公里,累计获得1万开发者、4万智能体、4000AI应用,服务建发集团、京港地铁、58同城等知名…

儿童学python语言能做什么,小孩学python到底好不好

大家好,小编来为大家解答以下问题,儿童学python语言能做什么,小孩学python课程需要多久,现在让我们一起来看看吧! 对于刚开始学习编程的孩子来说,图形化的Scratch是很好的启蒙语言。它用类似于拼图的模式&a…

【jackson】自定义字段注解完成序列化逻辑

目录 背景本文开发环境介绍新建一个注解新建一个JavaBean新建一个JsonSerializer新建一个AnnotationIntrospector单元测试总结 背景 Spring默认的JSON序列化工具使用的是jackson,GitHub项目地址: https://github.com/FasterXML/jackson 我们在处理前后端接口交互的…

Redis系列(一):深入了解Redis数据类型和底层数据结构

Redis有以下几种常用的数据类型: redis数据是如何组织的 为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对。 Redis全局哈希表(Global Hash Table)是指在Redis数据库内部用于存储所有键值对的主要数据结构。…

单参数构造函数的隐式类型转化

单参数构造函数的隐式类型转化 如果你不想发生隐式类型的转化,可以在默认构造函数前加上关键字:explicit 多参数的玩法和单参数的是不一样的 c98 不支持多参数隐式类型的转化 c11 支持多参数隐式类型的转化 举个例子: 多参数可以这样写&…

PhotoShop学习笔记

PhotoShop学习笔记 对图像进行缩放拉伸自动选中像素相近的同一个区域分离图层的选中区域分离图层的非选中区域处理不自然的缝合痕迹 记录一些PhotoShop中用到的操作,主要是在处理AI图像时遇到的需求。 对图像进行缩放拉伸 CTRLT 自动选中像素相近的同一个区域 魔…

24届近3年青岛理工大学自动化考研院校分析

今天给大家带来的是青岛理工大学控制考研分析 满满干货~还不快快点赞收藏 一、青岛理工大学 学校简介 青岛理工大学是一所以工为主,土木建筑、机械制造、环境能源学科特色鲜明,理工经管文法艺等学科协调发展的多科性大学。是国家首批地方…

金蝶云星空与巨益OMS对接集成采购退料查询打通退换货单创建

金蝶云星空与巨益OMS对接集成采购退料查询打通退换货单创建 来源系统:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上,提供了标准的管理模式;通过标准的业务架构:多会计准则、多币别、多地点、多组织、多税制应用框架等&#…

无涯教程-Perl - length函数

描述 此函数返回EXPR值的长度(以字符为单位),如果未指定,则返回$_。如果要确定相应的大小,请在数组或哈希上使用标量context。 语法 以下是此函数的简单语法- length EXPRlength返回值 此函数返回字符串的大小。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl$o…

多线程与高并发--------线程池

线程池 一、什么是线程池 在开发中,为了提升效率的操作,我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总就可以了。 比如做业务操…

浅谈LLAMA2核心函数generate源码

在学习LLAMA2的generate源码之前,先介绍Temperature超参数及sample_top_p的原理。 Temperature Temperature 是一个超参数,可用于控制生成语言模型中生成文本的随机性和创造性。用于调整模型的softmax输出层中预测词的概率。 softmax函数: p ( x i )…

JDK内置SPI机制、服务提供发现机制

SPI的全称是Service Provider Interface服务提供接口,是JDK内置的一种 服务提供发现机制,例如我们常用的数据库驱动Driver,就是基于SPI来做的。 运行机制: 服务的调用方需要调用服务提供方的服务,如果在调用方中直接…

插入、希尔、归并、快速排序(java实现)

目录 插入排序 希尔排序 归并排序 快速排序 插入排序 排序原理: 1.把所有元素分为两组,第一组是有序已经排好的,第二组是乱序未排序。 2.将未排序一组的第一个元素作为插入元素,倒序与有序组比较。 3.在有序组中找到比插入…

大语言模型之一 Attention is all you need ---Transformer

大语言模型已经在很多领域大显身手,其应用包括只能写作、音乐创作、知识问答、聊天、客服、广告文案、论文、新闻、小说创作、润色、会议/文章摘要等等领域。在商业上模型即产品、服务即产品、插件即产品,任何形态的用户可触及的都可以是产品&#xff0c…

面试题:ArrayList扩容时扩容多少?

大家好,我是你们的小米!今天要和大家一起来探讨一个在Java面试中经常被问到的问题:“ArrayList扩容时扩容多少?”相信很多小伙伴都在面试中遇到过这个问题,那么接下来,我就为大家详细解析一下这个问题&…

Vue3+Ts+Vite项目全局配置Element-Plus主题色

概述 我找了很多博客,想全局配置Elmenet-Plus组件主题色,但都没有效果。所以有了这篇博客,希望能对你有所帮助!!! 文章目录 概述一、先看效果二、创建全局颜色文件2.1 /src/styles 下新建 element-plus.sc…

C#应用处理传入参数 - 开源研究系列文章

今天介绍关于C#的程序传入参数的处理例子。 程序的传入参数应用比较普遍,特别是一个随操作系统启动的程序,需要设置程序启动的时候不显示主窗体,而是在后台运行,于是就有了传入参数问题,比如传入/h或者/min等等。所以此…

湘大 XTU OJ 1260 Completed String 题解(非常详细):建立数组下标和数组元素之间的映射关系 ~scanf

一、链接 1260 Completed String 二、题目 题目描述 给一个字符串,请判断字符串是否出现了所有的英文字母(不区分大小写)。 输入 每行一个只含英文字母的字符串,长度不超过1000。 输出 每行输出一个样例的结果&#xff0c…

SpringBoot案例-部门管理-新增

根据页面原型,明确需求 页面原型 需求 阅读接口文档 接口文档链接如下: 【腾讯文档】SpringBoot案例所需文档 https://docs.qq.com/doc/DUkRiTWVaUmFVck9N 思路分析 前端在输入要新增的部门名称后,会以JSON格式将数据传入至后端&#xf…

基于Python实现的有限元方程求解程序附源码

问题描述 根据已知下列非齐次两点边值问题(1.2.28) { L u − d d x ( p d u d x ) q u f , a < x < b , u ( a ) α , u ′ ( b ) β , \begin{cases} \boldsymbol{L} u-\frac{\mathrm{d}}{\mathrm{d} x}\left(p \frac{\mathrm{d} u}{\mathrm{~d} x}\right)q uf, a…