html 分页_MySQL——优化嵌套查询和分页查询

6caaa9c7874441956a688e7582e0f066.png

Java识堂,一个高原创,高收藏,有干货的微信公众号,欢迎关注

优化嵌套查询

嵌套查询(子查询)可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。嵌套查询写起来简单,也容易理解。但是,有时候可以被更有效率的连接(JOIN)替代。

现在假如要找出从来没有在网站中消费的客户,也就是查询在客户customer表中但是不在支付payment表中的客户信息。

嵌套查询:

explain select * from customer where customer_id not in (select customer_id from payment);

4bfc3b12dde848072eead1468b1a795c.png

连接改写:

explain select * from customer a left join payment b on a.customer_id = b.customer_id where b.customer_id is null;

1ac5a27f35cabe4dddf1d027688bea7c.png

画外音:连接查询效率更高的原因,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作;并且Not exists表示MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了。

优化分页查询

在MySQL中做分页查询,MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回 N 行,那当 offset 特别大的时候,效率就非常的低下。例如“limit 1000,20”,此时MySQL排序出前1020条数据后仅仅需要第1001到1020条记录,前1000条数据都会被抛弃,查询和排序的代价非常高。由此可见MySQL的分页处理并不是十分完美,需要我们在分页SQL上做一些优化,要么控制返回的总页数,要么对超过特定阈值的页数进行 SQL 改写

画外音:控制返回的总页数并不是那么靠谱,毕竟每页的数据量也不能过大,数据多起来之后,控制返回的总页数就变的不现实了。所以还是要对超过特定阈值的页数进行 SQL 改写

现在假设要对电影表film排序后取某一页数据

explain select * from film order by title limit 50,5;

b3c3c534658a4a2100a6ddc1e6d7408d.png

可以看到优化器实际上做了全表扫描,处理效率不高。

第一种优化思路

在索引上完成排序分页的操作,最后根据主键关联回表查询所需要的其他列内容。

画外音:此处涉及到了SQL优化的两个重要概念,索引覆盖和回表,我在前面的文章中详细介绍过这两个概念。通过索引覆盖在索引上完成扫描和排序(索引有序),最后通过主键(InnoDB引擎索引会通过主键回表)回表查询,最大限度减少回表查询的I/O次数。

explain select * from film a inner join (select film_id from film order by title limit 50,5)b on a.film_id = b.film_id;

3b2d2ba3e9ce75681a23ffd025c01003.png
6f8e248a74e581dc8d036e1095304339.png

第二种优化思路

把LIMIT查询转换成某个位置的查询,减少分页翻页的压力。

假设现在每页10条数据,要取第42页的数据。

explain select * from film order by title limit 410,10;

ce71c8e1bba59da56a6c58ca61b330ac.png

现在需要多传一个参数,就是上一页(第41页)的最后一条数据的主题title,

cb8fc028875a37d95c34966ca19a0ad7.png

SQL可以改写为:

explain select * from film where title>'HOLES BRANNIGAN' order by title limit 10;

1289beb6da8e630201122474284b2f3b.png

这样就把LIMIT m,n 转换成了LIMIT n的查询,但是这种方案只适合在不会出现重复值的特定环境,否则分页结果可能会丢失数据。

总结

对于嵌套查询和分页查询的优化,归根结底就是遵循SQL优化原则之一——减少回表查询的I/O次数。对于分页查询优化,更建议使用第一种优化方案,性能更好,稳定性更高。

原文:https://www.cnblogs.com/songwenjie/p/9563763.html

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

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

相关文章

从原理上搞定编码-- Base64编码

开发者对Base64编码肯定很熟悉,是否对它有很清晰的认识就不一定了。实际 上Base64已经简单到不能再简单了,如果对它的理解还是模棱两可实在不应该。大概介绍一下Base64的相关内容,花几分钟时间就可以彻底理解它。文 章下边贴了一个Base64的编…

android 点击选择文件夹,Android----弹出框选择文件夹目录以及启用新Task打开文件_IT168文库.pdf...

Android弹弹 出出框框 选选择择 文文件件 夹夹 目目录录 以以及及 启启用用新新 的的T ask打打 开开文文件件首首先先看看效效果果 图图第第一一个个 Act iv it y很很简简单单就就 一一个个按按钮钮 But t o n 加加一一个个 T ext View见见 main.xm l[[ cc -- ss hh aa rr pp ]…

docker mysql总是退出_Docker提升测试效率之路

现如今,Docker已经成为了很多公司部署应用、服务的首选方案。依靠容器技术,我们能在不同的体系结构之上轻松部署几乎任何种类的应用。作为测试一方,我们应与时俱进,将Docker容器技术应用到测试工作中。为了让小伙伴们可以快速上手…

2016030206 - mysql常用命令

参考地址如下: http://www.cnblogs.com/linjiqin/archive/2013/03/01/2939384.html http://www.cnblogs.com/zhangzhu/archive/2013/07/04/3172486.html 用户登陆 mysql> mysql -u 用户名 -p 密码;  例子: mysql>mysql -u root -p; 输…

32位mysql安装包_软件测试基础——Linux系统搭建MySQL数据库

一、mysql下载1. 下载:官方网址:https://dev.mysql.com/downloads/mysql/2. 选择相应的版本,由于cenos是基于红帽的,所以Select Operating System选择Red Hat...。我所用的镜像为cenos7所以Red Hat....linux7,一定要选相应的版本&…

android webview 获取 title,【报Bug】app webview 安卓机 title显示问题

// #ifdef APP-PLUSvar that this;that.statusBarHeight uni.getSystemInfoSync().statusBarHeight;var w plus.webview.create(this.weburl, id, {// top: uni.getSystemInfoSync().statusBarHeight 44 ,//放置在titleNView下方。如果还想在webview上方加个地址栏的什么的…

easyphp环境配置

apache的配置文件httpd.conf // apache/conf //修改http.conf这个文件的编辑权限 <Directory /> Options All AllowOverride All Order deny,allow Allow from all </Directory> LoadModule php5_module "E:/PROGRA~1/EASYPH~1.9/php/php539x141026161807/ph…

android wifi 组播,在Android上显示实时UDP或RTP流(多播)

我已经尝试从播放器(Daroon播放器&#xff0c;PlayStore)读取它&#xff0c;它运行良好&#xff0c;所以我认为我的愚蠢问题不是由于广播 .我看到可以通过不同的方式向用户显示视频内容&#xff1a;在ACTION_VIEW中使用新的Intent&#xff0c;Android会选择可以查看内容的应用程…

python gevent模块 下载_Python中的多任务,并行,并发,多线程,多进程,协程区别...

多任务CPU承担了所有的计算任务。一个CPU在一个时间切片里只能运行一个程序。当我们想同时运行多于一个程序的时候&#xff0c;就是多任务&#xff0c;例如同时运行微信&#xff0c;QQ&#xff0c;浏览器等等。多任务的目的是提升程序的执行效率&#xff0c;更充分利用CPU的资源…

uniapp点击通知android,分享uniapp使用原生Android推送消息(内推)以及点击通知监听数据...

前言由于用uniapp官方的plus.push.createMessage()在Android平台下推送通知无法显示推送时间&#xff0c;需要调用原生Android推送通知。在社区综合了各大神的代码&#xff0c;具体如下&#xff1a;推送推送事件&#xff1a;/*** android原生通知发送* param content 通知内容*…

电脑安装python后开不了机_ubuntu 安装python3.6后,terminal终端打不开问题

由于Ubuntu16.04&#xff0c;自带Python2.7和Python3.5 当我安装完Python3.6.5后,terminal终端打不开了, jekayjekay-pc:~$ gnome-terminal Traceback (most recent call last): File "/usr/bin/gnome-terminal", line 9, in from gi.repository import GLib, Gio F…

DIY小能手|别买电动滑板车了,咱做一台吧

!! http://www.shoudian.org/thread-316111-1-1.html http://www.jiequer.com/html/news/xinpin/2014/1218/223.html http://bbs.mydigit.cn/read.php?tid930053转载于:https://www.cnblogs.com/carl2380/p/5239022.html

setid android,android-如何将setId()用于imageView

我在GridViewAdapter类中在此处创建了一个imageView&#xff1a;Overridepublic View getView(int position, View convertView, ViewGroup parent) {// Try to reuse the viewsImageView view (ImageView) convertView;boolean checked (mCheckBoxnull)?false:(((CheckBox)…

vue-router 路由嵌套显示不出来_网络协议|OSI模型第三层网络层中的路由

的IP协议OSI第二层中用以太网协议定义了信息传输单元&#xff0c;简称为帧&#xff0c;它长这个样子。同样的在OSI第三层中&#xff0c;会用 IP 协议去定义信息传输单元&#xff0c;简称为数据包&#xff0c;它长这个样子。实际上&#xff0c;最终在网络上传输的是第二层的帧&a…

软件测试第一次作业--石家名 3013218062

在我编程的时候遇到最多的一个问题就是空指针&#xff0c;空指针主要集中在对象&#xff0c;指针、数组等一些对象中。 解决方法&#xff1a;通过使用断点&#xff0c;这时要特别注意一些对象&#xff0c;例如访问数据库中变量是否被赋值&#xff0c;这时可以将整个sql语句全都…

多次点击android版本出现棒棒糖,android – 为前棒棒糖设备创建循环显示

首先,这是与Create circular reveal for pre-Lollipop devices (Android)不同的问题我正在使用那里提到的库来创建Circular Reveal,但它似乎对我不起作用.XMLandroid:layout_width"match_parent"android:layout_height"match_parent">android:id"i…

asp.net怎么实现按条件查询_【33期】分别谈谈联合索引生效和失效的条件

点击上方“Java面试题精选”&#xff0c;关注公众号面试刷图&#xff0c;查缺补漏>>号外&#xff1a;往期面试题&#xff0c;10篇为一个单位归置到本公众号菜单栏->面试题&#xff0c;有需要的欢迎翻阅。这道题考查索引生效条件、失效条件。像这类问题才其实很有意义&…

java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...

本文来讲一种搜索算法&#xff0c;即二分搜索算法&#xff0c;通常在面试时也会被问到。我们先来看一个例子&#xff0c;在图书馆通常是根据查到的编号去找书&#xff0c;可以在书架上按顺序一本本地查找&#xff0c;也可以找到一本书不符合预期时&#xff0c;再跳过一大部分书…

framework层和native层实现联网控制(iptable方式)

最近工作中&#xff0c;需要开发一个功能----联网控制&#xff0c;这个功能其实用过root的安卓机应该都知道&#xff0c;禁止某个应用连接移动网络或者wifi。 root后&#xff0c;通过su去执行iptable的命令就可以根据uid去控制应用联网权限 但是由于公司是做手机系统开发&#…

android去掉png图片灰色背景,JS解决PNG图片灰色背景问题

PNG图片用来制作漂亮的网页背景很实用&#xff0c;此方法也是比较简单的&#xff0c;会让网页增色不少。不过&#xff0c;万恶的IE似乎暗中做对&#xff0c;当你使用PNG图片的时候&#xff0c;IE会自动为PNG图片增加一个灰色背景&#xff0c;这真的好让人烦&#xff0c;那么有没…