(MySQL經驗)之MySQL單表行數最好低于2000w

作為在后端開發,是不是經常聽到過,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.pswp.cn/news/34945.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34945.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34945.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何讓ES低成本、高性能?滴滴落地ZSTD壓縮算法的實踐分享

前文分別介紹了滴滴自研的ES強一致性多活是如何實現的、以及如何提升ES的性能潛力。由于滴滴ES日志場景每天寫入量在5PB-10PB量級,寫入壓力和業務成本壓力大,為了提升ES的寫入性能,我們讓ES支持ZSTD壓縮算法,本篇文章詳細展開滴滴…

Python 監控 Windows 服務

Python 監控 Windows 服務 Python 在 Windows 系統上可以使用 wmi 模塊來實現對 Windows 服務的監控。本文將介紹如何使用 Python 監控 Windows 服務,并實現服務狀態的查詢和服務啟停功能。 安裝依賴 在使用 wmi 模塊之前,需要先安裝 wmi包。可以使用…

[excel]vlookup函數對相同的ip進行關聯

一、需求(由于ip不可泄漏所以簡化如下) 有兩個sheet: 找到sheet1在sheet2中存在的ip,也就是找到有漏洞的ip 二、實現 vlookup函數有4個參數 第一個:當前表要匹配的列,選擇第一個sheet當前行需要處理的ip即可 第二個:第二個shee…

linux內核bitmap之setbit匯編實現

內核版本:kernel 0.12 首先看一段代碼,下面這段代碼來自內核版本0.12的mm/swap.c中: // mm/swap.c #define bitop(name,op) \static inline int name(char * addr,unsigned int nr) \ { \int __res; \__asm__ __volatile__("bt" …

蟻劍antSword-maste下載-安裝-使用-一句話木馬

下載 https://github.com/AntSwordProject/antSword 一句話木馬 hack.php腳本 <?php eval($_POST[attack]);?> 安裝 1、安裝完成后啟動 2、初始化&#xff0c;選擇有源碼的目錄 3、連接

03 什么是預訓練(Transformer 前奏)

博客配套視頻鏈接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 鏈接:https://github.com/nickchen121/Pre-training-language-model 配套博客鏈接:https://www.cnblogs.com/nickchen121/p/15105048.html 預訓練有什么用 機器學…

Linux(Web與html)

域名 DNS與域名&#xff1a; 網絡是基于tcp/ip協議進行通信和連接的 tcp/ip協議是五層協議&#xff1a;應用層–傳輸層—網絡層----數據鏈路層----物理層每一臺主機都有一個唯一的地址標識&#xff08;固定的ip地址&#xff0c;用于區分用戶和計算機。 ip地址&#xff1a;由…

深入淺出:MyBatis的使用方法及最佳實踐

這里寫目錄標題 添加MyBatis框架?持配置連接字符串和MyBatis配置連接字符串配置 MyBatis 中的 XML 路徑 添加業務代碼創建數據庫和表添加用戶實體類添加 mapper 接?添加 UserMapper.xml添加 Service層添加 Controller層 增刪改操作增加操作刪除操作修改操作 添加MyBatis框架?…

JVM 基礎

鞏固基礎&#xff0c;砥礪前行 。 只有不斷重復&#xff0c;才能做到超越自己。 能堅持把簡單的事情做到極致&#xff0c;也是不容易的。 JVM 類加載機制 JVM 類加載機制分為五個部分&#xff1a;加載&#xff0c;驗證&#xff0c;準備&#xff0c;解析&#xff0c;初始化&am…

Hadoop安裝完全分布式搭建

1、安裝Hadoop 上傳Hadoop的指定路徑/root/softwares 解壓安裝 cd /root/softwares && tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local配置環境變量 vim /etc/profile # Hadoop Environment export HADOOP_HOME/usr/local/hadoop-2.7.3 export PATH$PATH:$HADOOP_HOM…

openCV使用c#操作攝像頭

效果如下&#xff1a; 1.創建一個winform的窗體項目&#xff08;框架.NET Framework 4.7.2&#xff09; 2.Nuget引入opencv的c#程序包&#xff08;版本最好和我一致&#xff09; 3.后臺代碼 using System; using System.Collections.Generic; using System.ComponentModel;…

用友-NC-Cloud遠程代碼執行漏洞[2023-HW]

用友-NC-Cloud遠程代碼執行漏洞[2023-HW] 一、漏洞介紹二、資產搜索三、漏洞復現PoC小龍POC檢測腳本: 四、修復建議 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失&#…

Leetcode-每日一題【劍指 Offer 24. 反轉鏈表】

題目 定義一個函數&#xff0c;輸入一個鏈表的頭節點&#xff0c;反轉該鏈表并輸出反轉后鏈表的頭節點。 示例: 輸入: 1->2->3->4->5->NULL輸出: 5->4->3->2->1->NULL 限制&#xff1a; 0 < 節點個數 < 5000 解題思路 1.題目要求我們反轉…

Windows下運行Tomcat服務時報GC Overhead Limit Exceeded

根本原因是在新建Tomcat作為Windows服務時&#xff0c;系統默認設置的堆內存太小了&#xff0c;我們打開/bin/service.bat文件&#xff0c;將如下圖所示的默認值改大一些就好了 if "%JvmMs%" "" set JvmMs512 if "%JvmMx%" "" set J…

高防cdn和高防服務器有什么不一樣?

高防cdn&#xff1a; 相信很多看過我們文章的小伙伴對cdn已經很了解了&#xff0c;cdn的原理很簡單&#xff0c;就是構建在網絡上的很多個節點&#xff0c;為網站作內容 分發。使用戶就近獲取所需資源。且分配的cdn節點都是高防節點&#xff0c;每個節點都有防御功能。還…

【考研復習】24王道數據結構課后習題代碼|第3章棧與隊列

文章目錄 3.1 棧3.2 隊列3.3 棧和隊列的應用 3.1 棧 int symmetry(linklist L,int n){char s[n/2];lnode *pL->next;int i;for(i0;i<n/2;i){s[i]p->data;pp->next;}i--;if(n%21) pp->next;while(p&&s[i]p->data){i--;pp->next;}if(i-1) return 1;…

Python flask-restful 框架講解

1、簡介 Django 和 Flask 一直都是 Python 開發 Web 的首選&#xff0c;而 Flask 的微內核更適用于現在的云原生微服務框架。但是 Flask 只是一個微型的 Web 引擎&#xff0c;所以我們需要擴展 Flask 使其發揮出更強悍的功能。 python flask框架詳解&#xff1a;https://blog.…

sentinel簡單使用

核心demo&#xff1a; 1 引入依賴: <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.0</version> </dependency>2 核心代碼&#xff1a; 3 限流保護代碼&#xff1a;…

【Megatron-DeepSpeed】張量并行工具代碼mpu詳解(四):張量并行版Embedding層及交叉熵的實現及測試

相關博客 【Megatron-DeepSpeed】張量并行工具代碼mpu詳解(四)&#xff1a;張量并行版Embedding層及交叉熵的實現及測試 【Megatron-DeepSpeed】張量并行工具代碼mpu詳解(三)&#xff1a;張量并行層的實現及測試 【Megatron-DeepSpeed】張量并行工具代碼mpu詳解(一)&#xff1a…

【HarmonyOS】@ohos.request 上傳下載的那些事兒

【關鍵字】 ohos.request、上傳下載? 【寫在前面】 在進行HarmonyOS應用開發時&#xff0c;可能需要進行上傳或下載文件功能開發&#xff0c;本文章主要進行上傳下載相關功能介紹和一些注意事項及FAQ。 【上傳開發步驟】 步驟1&#xff1a;上傳下載接口需要申請ohos.permis…