背景
基本上只要是做后台开发,都会接触到分页这个需求或者功能吧。基本上大家都是会用MySQL的LIMIT来处理,而且我现在负责的项目也是这样写的。但是一旦数据量起来了,其实LIMIT的效率会极其的低,这一篇文章就来讲一下LIMIT子句优化的。

LIMIT优化
很多业务场景都需要用到分页这个功能,基本上都是用LIMIT来实现。

建表并且插入200万条数据:

新建一张t5表

CREATE TABLE t5 (
id int NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
text varchar(100) NOT NULL,
PRIMARY KEY (id),
KEY ix_name (name),
KEY ix_test (text)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建存储过程插入200万数据

CREATE PROCEDURE t5_insert_200w()
BEGIN
DECLARE i INT;
SET i=1000000;
WHILE i<=3000000 DO
INSERT INTO t5(name,text) VALUES(‘god-jiang666’,concat(‘text’, i));
SET i=i+1;
END WHILE;
END;

调用存储过程插入200万数据

call t5_insert_200w();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
在翻页比较少的情况下,LIMIT是不会出现任何性能上的问题的。

但是如果用户需要查到最后面的页数呢?

通常情况下,我们要保证所有的页面可以正常跳转,因为不会使用order by xxx desc这样的倒序SQL来查询后面的页数,而是采用正序顺序来做分页查询:

select * from t5 order by text limit 100000, 10;
1
在这里插入图片描述

采用这种SQL查询分页的话,从200万数据中取出这10行数据的代价是非常大的,需要先排序查出前1000010条记录,然后抛弃前面1000000条。我的macbook pro跑出来花了5.578秒。

接下来我们来看一下,上面这条SQL语句的执行计划:

explain select * from t5 order by text limit 1000000, 10;
1
在这里插入图片描述

从执行计划可以看出,在大分页的情况下,MySQL没有走索引扫描,即使text字段我已经加上了索引。

这是为什么呢?

回到MySQL索引(二)如何设计索引中有提及到,MySQL数据库的查询优化器是采用了基于代价的,而查询代价的估算是基于CPU代价和IO代价。

如果MySQL在查询代价估算中,认为全表扫描方式比走索引扫描的方式效率更高的话,就会放弃索引,直接全表扫描。

MySQL分优化之超大页查询相关推荐

  1. MySQL第9天:MySQL索引优化分析之join查询

    MySQL索引优化分析之join查询 #编写时间:2017.3.12 #编写地点:广州 常见join查询: 1.SQL执行顺序:手写.机读.总结 (1)手写 (2)机读 (3)总结 2.join图 3 ...

  2. MySQL优化之超大分页查询

    背景 基本上只要是做后台开发,都会接触到分页这个需求或者功能吧.基本上大家都是会用MySQL的LIMIT来处理,而且我现在负责的项目也是这样写的.但是一旦数据量起来了,其实LIMIT的效率会极其的低, ...

  3. mysql分表全局查询_mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表...

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  4. python mysql索引 优化神器explain 慢查询

    ##############总结########## 数据库中专门帮助用户快速找到数据的一种数据结构 类似于字典的目录的索引 索引的作用:约束和加速查找 工作原理: b+树形结构 最上层是树根,中间是 ...

  5. MySQL 自增 ID 超大问题查询

    引言 小A正在balabala写代码呢,DBA小B突然发来了一条消息,"快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了 ...

  6. mysql 分表后利用视图查询数据

    1.通常我们会遇到这样的情况:使用年限进行分表,例如2020年一个表.2021年一个表 2.这种情况查询就可以借助视图工具的帮助,我们可以新建一个视图工具, 先利用一个表,运行sql语句创建好视图,点 ...

  7. 常见mysql性能优化方法

    mysql性能优化: 1.为查询缓存优化你的查询 2.explain你的查询 3.当只要一行数据的时候使用limit 1 4.为搜索字段建立索引 5.千万不要order by rand() 6.避免s ...

  8. mysql分页查询关键_MySQL优化教程之超大分页查询

    背景 基本上只要是做后台开发,都会接触到分页这个需求或者功能吧.基本上大家都是会用MySQL的LIMIT来处理,而且我现在负责的项目也是这样写的.但是一旦数据量起来了,其实LIMIT的效率会极其的低, ...

  9. mysql分表 查询 优化_MySQL性能管理及架构(查询优化、分库分表)一遍文章搞定...

    相关配置参数: slow_query_log # 启动停止记录慢查日志,慢查询日志默认是没有开启的可以在配置文件中开启(on) slow_query_log_file # 指定慢查日志的存储路径及文件 ...

最新文章

  1. iOS实现ScrollView中子控件(Button,自定义View)的触摸事件响应
  2. 中汽协谈芯片短缺:芯片价格或上涨,部分车企在明年会受较大影响
  3. to_string()函数----将int类型转换为string型
  4. Spring-Aop-XML实现
  5. 求正多边形的面积JAVA_第六章第三十六题(几何:正多边形的面积)(Geometry: area of a regular polygon)...
  6. 实录分享 | 计算未来轻沙龙:对话系统研究进展(视频 + PPT)
  7. 如何判断链表中存在环路
  8. 甲骨文每季安全更新再修补297个漏洞
  9. JDK和JRE的区别
  10. ROS 2 Crystal Clemmys版机器人操作系统补充说明
  11. matlab 填充透明色,在Matlab中使用透明像素填充数组
  12. 清理掉大流氓:2345
  13. 计算机网络——虚拟专用网与网络地址转换NAT
  14. mysql rand 范围_MySQL的指定范围随机数函数rand()的使用技巧
  15. Hadoop安装snappy(编译源码)
  16. 使用证件照研究院接口实现制作证件照
  17. 修复 Windows 映像
  18. 多线程比串行进程多出的优势在哪里
  19. iphone11卡住不能关机_iphone11怎么强制关机_苹果11promax的两种强制关机方法
  20. web前端开发(包括任何行业)要不要找个师傅带?

热门文章

  1. java 批量插入clob_SpringBoot系列(16)线程池Executors并发编程之批量查询-插入数据
  2. CSS练习_无限滚动
  3. led伏安特性实验误差分析_高中物理 | 电学实验满分知识点总结+拓展+例题精讲,罕见的好资料,收藏不亏!...
  4. 计算机word设置渐变填充,Word中鲜为人知的渐变效果设置
  5. 计算机可以待机无法关机,win7怎么设置不待机?如何设置自动关机的方法【详解】...
  6. mysql可扩展数据库_五大技巧提高MySQL可扩展性
  7. ie8支持jq的html,jquery 什么版本不能用 ie8
  8. python中 if __name__ == ‘__main__‘
  9. mysql删除emp表的语句_MySQL删除数据表(DORP TABLE语句)
  10. 永磁同步电机矢量控制中的双闭环是什么意思_三菱伺服控制器与变频器区别,三菱伺服控制器优势在哪?...