MySQL单表百万数据记录分页性能优化

【MySQL】阿里:MySQL 单表数据最大不要超过多少行?为什么? B+树叶子和非叶子结点的数据页都是16k,且数据结构一致,区别在于叶子节点放的是真实的行数据,而非叶子结点放的是主键和下一个页的地址。B+树一般有两到三层,由于其高扇出,三层就能支持2kw以上的数据,且一次查询最多1~3次磁盘IO,性能也还行。存储同样量级的数据,B树比B+树层级更高,因此磁盘IO也更多,所以B+树更适合成为mysql索引。索引结构不会影响单表最大行数,2kw也只是推荐值,超过了这个值可能会导致B+树层级更高,影响查询性能。单表最大值还受主键大小和磁盘大小限制。 阅读详情

背景:

自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行。

 

测试环境:

先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息 

useinfomation_schema
SELECT * FROM TABLES WHERE TABLE_SCHEMA =
‘dbname’ AND TABLE_NAME = ‘product’ 

查询结果:

  

从上图中我们可以看到表的基本信息: 

表行数:866633
平均每行的数据长度:5133字节
单表大小:4448700632字节 

关于行和表大小的单位都是字节,我们经过计算可以知道 

平均行长度:大约5k
单表总大小:4.1g
表中字段各种类型都有varchar、datetime、text等,id字段为主键

 

测试实验

1.   直接用limit start, count分页语句, 也是我程序中用的方法: 

select * from product limit start, count 

当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条), 如下: 

select * from product limit 10, 20   0.016秒

select * from product limit 100, 20   0.016秒

select * from product limit 1000, 20   0.047秒

select * from product limit 10000, 20   0.094秒 

我们已经看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟起始页码是有很大关系的,那么我们把起始记录改为40w看下(也就是记录的一般左右) 

select * from product limit 400000, 20  3.229秒

再看我们取最后一页记录的时间 

select * from product limit 866613, 20  37.44秒 

难怪搜索引擎抓取我们页面的时候经常会报超时,像这种分页最大的页码页显然这种时间是无法忍受的。 

从中我们也能总结出两件事情:

1)limit语句的查询时间与起始记录的位置成正比

2)mysql的limit语句是很方便,但是对记录很多的表并不适合直接使用。 

2.   对limit分页问题的性能优化方法 

利用表的覆盖索引来加速分页查询 

我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。 

因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。另外Mysql中也有相关的索引缓存,在并发高的时候利用缓存就效果更好了。 

在我们的例子中,我们知道id字段是主键,自然就包含了默认的主键索引。现在让我们看看利用覆盖索引的查询效果如何: 

这次我们之间查询最后一页的数据(利用覆盖索引,只包含id列),如下: 

select id from product limit 866613, 200.2秒 

相对于查询了所有列的37.44秒,提升了大概100多倍的速度 

那么如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况: 

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20 

查询时间为0.2秒,简直是一个质的飞跃啊,哈哈 

另一种写法 

SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id 

查询时间也很短,赞! 

其实两者用的都是一个原理嘛,所以效果也差不多。


linux cma alloc fail 问题分析 摘要:日志显示CMA连续内存分配失败(错误码-ENOMEM),请求128页(512KB)内存时因CMA区域不足或内存碎片导致失败。分析发现系统CMA总内存131072KB,空闲65536KB。解决方案包括:1)手动触发内存碎片整理;2)修改设备树或内核配置增大CMA区域(如从16MB增至20MB)。通过调整CONFIG_CMA_SIZE_MBYTES或设备树中的size参数可解决该问题。 阅读详情

相关推荐

PID算法(位置式pid算法和增量式pid算法)

PID 算法是闭环控制系统中常用的算法,PID 分别是 Proportion(比例)、Integral(积分)、Differential(微分)的首字母缩写。它是一种结合比例、积分和微分三个环节于一体的闭环控。

m0_57678852的博客 2万+

MySQL学习笔记-2

悲观锁(数据库):认为数据随时会被修改,因此每次读取数据之前都会上锁,防止其它事务读取或修改数据;应用于数据更新比较频繁的场景;乐观锁:操作数据时不会上锁,但是更新时会判断在此期间有没有别的事务更新这个数据,若被更新过,则失败重试;适用于读多写少的场景。乐观锁的实现方式有:不采用数据库自身的锁机制,而是通过程序来实现。加一个版本号或者时间戳字段,每次数据更新时同时更新这个字段;先读取想要更新的字段或者所有字段,更新的时候比较一下,只有字段没有变化才进行更新。

yueliangzy的博客 4761

STM32串口调试踩坑记:HAL_UART_ErrorCallback里不先解锁,你的中断接收就废了

本文深入分析了STM32串口调试中HAL_UART_ErrorCallback的锁机制陷阱,指出在错误回调中不先解锁会导致中断接收失效的问题。通过解析HAL库源码,提出了正确的错误处理实现方法,并分享了预防措施与最佳实践,帮助开发者提升串口通信的可靠性。

weixin_33733810的博客 512

Mysql单表最大记录是多少

mysql单表最大记录数不能超过多少?

自救 唯有自强 5087

自动驾驶关键技术(一):时间敏感网络TSN

时间敏感网络TSN的基本概念、协议族介绍和开发流程。

3079

MFC 修改CheckBox的文本颜色方法

设置主题 这一步是必须的,不可省略。 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 设置主题 HWND

Kim的博客 2249

MySQL 单表可以放多少数据,最多 2000 万?

title、description 分别为 varchar(50)、varchar(250),这两个应该都不会产生溢出页(不太确定),字符编码均为 utf8mb4,实际生产中 70% 以上都是存的中文( 3 字节),25% 为英文(1 字节),还有 5% 为 4 字节的表情,则存满的情况下将占用 (50+250)×(0.7×3+0.25×1+0.05×4) =说明:以上的数据计算,仅供参考,因为有的文章说,在主键为 bigint 的情况下,可存放 160 万叶子节点,整整多出 65 万。

java_2017_csdn的博客 2710

医疗AI新思路:为什么Graph Neural Network能改善气道分割的漏检问题?

本文探讨了Graph Neural Network(GNN)在医疗AI领域改善气道分割漏检问题的创新应用。通过分析3D UNet等传统方法的局限性,揭示了GNN在图结构建模中的独特优势,特别是在捕捉细小末梢支气管方面的突破性表现。文章详细介绍了UNet-GNN混合架构的设计原理、实验性能对比及优化方向,为CT影像分析提供了新思路。

weixin_30379531的博客 224

数据库性能优化—MySQL单表最大记录数超过多少时性能会严重下降

以前没有想过MySQL数据库的单表最大行数,直到最近interview时被问到c语言中int类型的最大值是多少时才想到Mysql单表最大行数的问题。 一开始被问到C语言中int类型的最大值有点懵逼,一般这种问题都是在校招时候会被问到,对于工作多年的人不会问这个问题。被问到这个问题的时候,大脑中思考的不是int类型最大值到底是多少?而是为什么这个问题很经典,经常被问,了解这个东西能用到什么地方呢?于是很快想到了MySql单表的最大记录数是多少,因为表的id一般是自增长的int类型。 下面是粘贴自其他伙伴的

sanmi8276的博客 1万+

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1898

高项备考论文:规划绩效域

高项备考论文:规划绩效域

liuxu324的博客 1126

mysql单表百万_MySQL单表百万数据记录分页性能优化技巧

测试环境:先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息use infomation_schemaSELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname' AND TABLE_NAME = ‘product'查询结果:从上图中我们可以看到表的基本信息:表行数:866633平均每行的数据长度:5133字节单表大小:4448700632字节...

weixin_29219189的博客 351

扫码登录原理

扫码登录功能通过PC端与移动端的交互实现安全认证,分为三个阶段:待扫描阶段生成唯一二维码ID并轮询状态;已扫描阶段移动端提交token与二维码ID关联,生成临时token并要求用户确认;确认阶段验证临时token后为PC端生成正式登录凭证。整个过程通过二维码唯一性、状态轮询和二次确认机制确保安全性,防止未授权登录,最终完成跨设备认证流程。

阿杰同学的博客 344

mysql 单表百万数据记录分页性能优化

背景:自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行。测试环境:先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息use infomation_schema SELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname’ AND TABLE_NAME = ‘pr

Code-lover's Learning Notes 829

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

MySQL 单表百万数据记录分页性能优化

MySQL 单表百万数据记录分页性能优化 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行。 测试环境: 先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息 use infomation_schema

echocdzh的博客 554

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL单表百万数据记录分页性能优化 limit优化

背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行。 测试环境: 先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息 use infomation_schema SELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname’

u012889638的专栏 4163

MySQL单表百万数据记录分页性能优化技巧

自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行测试环境:先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息use infomation_schema SELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname' AND TABLE_NAME = ‘produ...

niuzaiwenjie的专栏 690
上一篇: HTTP简述
下一篇: HTTPS 工作原理和 TCP 握手机制
Mr_Chungh
博客等级 码龄10年 25粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值