oschina mysql limit_如何提高MySQL Limit查询的性能

在MySQL数据库操作中,我们在做一些查询的时候总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的。其实我们可以使用Limit关键字来避免全表扫描的情况,从而提高效率。

有个几千万条记录的表 on MySQL 5.0.x,现在要读出其中几十万万条左右的记录。常用方法,依次循环:

1

select *from mytablewhere index_col = xxx limit offset, limit;

经验:如果没有blob/text字段,单行记录比较小,可以把 limit 设大点,会加快速度。

问题:头几万条读取很快,但是速度呈线性下降,同时 mysql server cpu 99% ,速度不可接受。

调用 explain select * from mytable where index_col = xxx limit offset, limit;

显示 type = ALL

在 MySQL optimization 的文档写到"All"的解释

A full table scan is done for each combination of rows from the previous tables. This is normally not good if the table is the first table not marked const, and usually very bad in all other cases. Normally, you can avoid ALL by adding indexes that allow row retrieval from the table based on constant values or column values from earlier tables.

看样子对于 all, mysql 就使用比较笨的方法,那就改用 range 方式? 因为 id 是递增的,也很好修改 sql 。

select * from mytable where id > offset and id < offset + limit and index_col = xxx

explain 显示 type = range,结果速度非常理想,返回结果快了几十倍。

Limit语法:

1

SELECT *FROM table LIMIT [offset,]rows |rows OFFSET offset

LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是一个整数常量。

如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。

为了与 PostgreSQL 兼容,MySQL 也支持句法:LIMIT # OFFSET #。

1

mysql>SELECT *FROM table LIMIT 5,10; //检索记录行6-15

2

3

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为-1

4

mysql>SELECT *FROM table LIMIT 95,-1; //检索记录行96-last

5

6

//如果只给定一个参数,它表示返回最大的记录行数目,换句话说,LIMIT n 等价于 LIMIT 0,n

7

mysql>SELECT *FROM table LIMIT 5; //检索前5个记录行

MySQL的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。同样是取10条数据,下面两句就不是一个数量级别的。

1

select *from table limit 10000,10

2

select *from table limit 0,10

文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。

这里我具体使用数据分两种情况进行测试。

1、offset比较小的时候:

1

select *from table limit 10,10

2

//多次运行,时间保持在0.0004-0.0005之间

3

Select *From table Where vid >=(Select vidFrom table Order By vid limit 10,1) limit 10

4

//多次运行,时间保持在0.0005-0.0006之间,主要是0.0006

结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。

2、offset大的时候:

1

select *from table limit 10000,10

2

//多次运行,时间保持在0.0187左右

3

4

Select *From table Where vid >=(Select vidFrom table Order By vid limit 10000,1) limit 10

5

//多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

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

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

相关文章

Mybatis原理:结果集封装详解

​ 经过sql参数解析、sql动态组装和执行sql&#xff0c;相对而言&#xff0c;结果集的封装&#xff0c;是mybatis数据处理的最后一环。这里只对查询结果而言&#xff0c;因为更新语句一般都是返回影响的行数。抛开mybatis&#xff0c;如果让我们组装结果&#xff0c;我们该如何…

python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...

Pyhton——面向对象进阶二&#xff1a;一、类的内置函数补充1、isinstance(obj,cls)——检查obj是否是该类的对象class Hoo:def __init__(self,name,tem):self.name nameself.tem temclass foo(Hoo):passf1foo(e,20)print(isinstance(f1,Hoo))首先 f1 肯定是 foo 的对象&…

vue项目打包后部署到服务器(超详细步骤)

耽误了几天, 终于开始写第二篇博客了, 这篇会讲怎么将vue项目打包部署到服务器, 其实和上一篇的uni-app步骤一样的, 就是最后多了一步修改nginx配置, 好 , 上操作 一 ,打包项目 vscode下载链接&#xff1a;https://pan.baidu.com/s/1ibHt7XB6EZy37BDb1CigWw 提取码&#xff1…

postman怎么不登陆使用_最新百度云不限速,免安装、免登陆、不限速,打开网站就能使用...

上次给大家安利了一波Pandownload手机版/电脑版。那篇文章中也说了&#xff0c;这类应用使用不当可能会遇到账号被限速的情况&#xff0c;而且手机版必须登录才能进行不限速下载。总之&#xff0c;凡是没登录账号的小伙伴&#xff0c;下载过程会非常曲折。那么是否有无需登录就…

vue项目配置打包测试环境/生产环境

vue项目配置打包测试环境/生产环境&#xff1a; 开发环境运行命令&#xff1a;npm run serve 生产环境打包命令&#xff1a;npm run pro 测试环境打包命令&#xff1a;npm run build 步骤&#xff1a; 1.项目中添加一个配置ip的js文件&#xff0c;比如如下的ip-config.js&…

mysql命令实践_MySQL:常用命令行

登入mysql -h192.168.1.110 -uroot -ppassword登出quit/exit查看数据库show databases;用户权限#添加grant select on db.table to userhost;grant select,update on *.* to test%;#撤销revoke all on *.* from test%;#查看show grants;show grants for userlocalhost#删除用户…

SpringMVC访问WEB-INF下的jsp解决方案Spring Boot集成使用jsp

SpringMVC访问WEB-INF下的jsp解决方案 一. 问题 ​将项目中用到的jsp等文件放在WEB-INF目录下。实际开发过程中&#xff0c;需要在框架页面通过iframe嵌入对应的具体页面&#xff0c;此处如果直接调用对应页面所在的url地址&#xff0c;则会提示404错误。 ​ WEB-INF目录下的…

SpringBoot | 详解SpringBoot配置文件及其原理

文章目录一、配置文件二、YAML语法1、基本语法2、值的写法(1)、字面量&#xff1a;普通的值&#xff08;数字&#xff0c;字符串&#xff0c;布尔&#xff09;(2)、对象、Map&#xff08;属性和值&#xff09;(3)、数组&#xff08;List、Set&#xff09;三、配置文件值注入1、…

mysql 自连接 树形_自连接表的相关问题(树形结构)

问题一&#xff1a;自连接表肯定是相似 Id(PK),parentId(FK),name ….了Id假如是主键的话&#xff0c;parentId就是外键了&#xff0c;可是树形结构肯定是有根节点了&#xff0c;那么根节点的parentId按理说应该是null,原因是根节点没有父节点&#xff0c;可是主键Id是不能为空…

简述python程序的运行原理_谈谈 Python 程序的运行原理

执行 python demo.py 后&#xff0c;将会启动 Python 的解释器&#xff0c;然后将 demo.py 编译成一个字节码对象 PyCodeObject。在 Python 的世界中&#xff0c;一切都是对象&#xff0c;函数也是对象&#xff0c;类型也是对象&#xff0c;类也是对象(类属于自定义的类型&…

【深入理解JVM】:Java内存模型JMM

多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏&#xff0c;使用每秒事务处理数&#xff08;Transactions Per Second&#xff0c;TPS&#xff09;这个指标比较能说明问题&#xff0c;它代表着一秒内服…

java 上下文加载器_【深入理解Java虚拟机 】线程的上下文类加载器

线程上下文类加载器线程上下文类加载器( Thread Context ClassLoader) 是从JDK1.2 引入的&#xff0c;类Thread 的getContextClassLoader() 与 setContextClassLoader(Classloader var1) 分别用来设置线程的上下文类加载器。如果没有指定线程的上下文的加载器&#xff0c;那么线…

You may use special comments to disable some warnings.Use // eslint-disable-next-line to ignore...

vue没写什么爆红 错误原因 ESLint] 对语法的要求过于严格导致编译的时候报上图那些错误。 要知道&#xff0c;这并不是代码有异常&#xff0c;而是代码格式有问题&#xff0c;这些错误并不会影响代码的执行结果。 解决方法 很简单&#xff0c;既然是ESLint 语法错误&#xff…

java is a like a_JAVA基础——is-a 、have-a、和 like-a的区别

1、is-a&#xff0c;has-a&#xff0c;like-a是什么在面向对象设计的领域里&#xff0c;有若干种设计思路&#xff0c;主要有如下三种&#xff1a;is-a、has-a、like-ajava中在类、接口、抽象类中有很多体现。了解java看这里&#xff1a;什么是Java了解类和对象看这里&#xff…

Java根据日期生成编号

1、Java根据日期生成编号 根据日期生成编号 1、使用 DateTimeFormatter DateTimeFormatter fmt DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");//设置日期格式 String newsNo "xw"LocalDateTime.now().format(fmt);2、使用 SimpleDateFormat Si…

Java数字位数不足前面补0的几种办法

public static void main(String[] args) {int num6; DecimalFormat decimalFormat new DecimalFormat("000000");String numFormat decimalFormat .format(num);System.out.println(numFormat);//打印结果"000006" }Testpublic void test() {this.printT…

java jni 原理_JNI的实现原理

JNI接口函数和指针Java虚拟机访问本机代码通过调用JNI的功能特性。JNI的功能都可以通过一个接口指针。一个接口指针是一个指向指针的指针。这个指针指向一个一个指针数组&#xff0c;这个数组中的每一个成员指向一个函数入口。每个接口的功能是在一个预定义的内部数组的偏移量。…

jQuery ajax读取本地json文件_jQuery请求本地JSON文件,在谷歌浏览器运行时报跨域错误_Vscode使用Live Server

json文件 {"first":[{"name":"张三","sex":"男"},{"name":"李四","sex":"男"},{"name":"王武","sex":"男"},{"name":"李…

java执行curl命令_Java执行curl命令

Java执行curl命令需要注意的是&#xff0c;命令需要以数组的形式传递参数&#xff0c;就是把正常的命令以空格切分成数组就行了。而且参数前后不能有空格&#xff0c;不然会报错。具体的测试代码如下&#xff1a;import java.io.BufferedReader;import java.io.IOException;imp…

Vue打包并发布项目

一、 打包vue项目步骤&#xff1a; 1、对当前vue项目进行打包的命令如下&#xff1a; npm run build2、打包完成&#xff0c;会输出Build complete并且在vue项目中会生成一个名字为dist的打包文件。如下图&#xff1a; 二、 使用静态服务器工具包发布打包的vue项目 1、首先…