文档章节

MYSQL——SQL优化继上篇

w
 waterme
发布于 2016/07/09 23:29
字数 826
阅读 13
收藏 0

9)优化分页limit进行分页的时候limit 1,20 21,20.......10001,20.当进行到后面的时候,比如limit 10001,10020就会非常慢。可以采用在查询第一次的时候把最后数据的id记录下来,下面的uuid0就是上一次的id,uuid1是一个预估范围。在下一次查询的时候就可以select * from tablename where id>uuid0 and where id<uuid1 order by id limit 10001,20

测试:表数据工5万多条

一个普通的limit写法:

EXPLAIN SELECT * FROM user_admin ORDER BY admin_id LIMIT 10000,20 

id select_type table type possible_keys key key_len ref rowsExtra 

1 SIMPLE user_admin index (NULL) PRIMARY 4 (NULL) 10020 (NULL) 

可以看到rows:10020扫描了10020条数据。如果表数据很大的话后面的分页性能会急剧下降。

好吧,优化

预估范围

EXPLAIN SELECT * FROM user_admin WHERE admin_id<10030 AND admin_id>10000 ORDER BY admin_id ASC LIMIT 20

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE user_admin range PRIMARY PRIMARY 4 (NULL) 28 Using where 

ok

当表数据很庞大的时候也可以使用延迟关联的方式提高效率

EXPLAIN SELECT * FROM user_admin INNER JOIN ( SELECT admin_id FROM user_admin ORDER BY admin_id ASC LIMIT 10000,20) aUSING(admin_id)

id select_type table type possible_keys key key_len ref rowsExtra 

1 PRIMARY<derived2> ALL (NULL) (NULL) (NULL) (NULL) 10020 (NULL) 

1 PRIMARY user_admin eq_ref PRIMARY PRIMARY 4 a.admin_id 1 (NULL) 

2 DERIVED user_admin index (NULL) PRIMARY 4 (NULL) 57252 Using index

可以看出预估扫描的行数是非常多的,笔者进行了各种交换顺序也未能有效解决扫描行数多的情况。所以这种情况一定要做测试。。一般不建议采用。。


是否使用此种方法还是要具体问题具体分析。


还有一种较为普遍的做法就是事先将一定的数据量做缓存,比如缓存1000条数据(常用的数据),这样在取前面10页或者几页的时候就直接在缓存中获取。应用程序可以根据结果集的大小采取不同的策略。如果少于1000就直接在页面上显示所有的分页链接。大于1000时再去数据库按上述方法取数据。


优化总则:

1)索引优化正确的使用索引

2)查询需要的数据ninnodb引擎的话where条件中有主键时可以直接使用select *,因为innodb的主键中存储了其他列信息,如果不含主键在查询时尽量只查询需要的字段。

3)切分查询切分查询是将一个查询分多次执行。比如一次较大的delete可以分几次来执行

4)分解关联查询分解关联查询就是将一个大的关联查询分解为多个小的查询,一次查询出一部分数据,可以有效的使用缓存。但是不一定是所有的查询都要进行分解,因为分解后的查询语句可读性不强,对于以后的维护会有一定的困难。

总结:优化查询语句需要从几方面入手考虑:

1、 减少数据访问(减少磁盘访问)

2、 返回更少数据(减少网络传输或磁盘访问)

3、 减少交互次数(减少网络传输)

4、 减少服务器CPU开销(减少CPU及内存开销)

5、 利用更多资源(增加资源)

 

 

 

 

 

 


本文转载自:http://blog.csdn.net/feihongxueni/article/details/51170516

共有 人打赏支持
w
粉丝 0
博文 27
码字总数 0
作品 0
海淀
2018年swoole实战6-异步redis

继上篇 2018年swoole实战5-异步mysql 本篇演示 异步Redis客户端 代码如下: 执行结果: 小结 swoole提供的异步操作:io,mysql, redis 等,都是为了避免这些耗时的操作阻塞了程序,减少用户的...

章鱼喵_
07/27
0
0
HttpClient4.5.2 使用cookie保持会话——如何传递多个cookie(3)

继上篇HttpClient4.5.2 使用cookie保持会话——获取cookie之后如何传递它(2) 之后,传递多个cookie到后端。 1、通过CookieStore 和HttpClientContext 2、通过header 头进行传递 至此如何获取...

子群
2016/07/20
404
0
GROUP BY另类优化技巧

分享嘉宾:知数堂〖SQL开发优化班〗讲师郑松华,韩国Infobridge的SQL优化专家&7年SQL开发和调优经验&资深数据库工程师。 本次主题《GROUP BY另类优化技巧》,主要内容是从 GROUP BY、ORDER B...

iMySQL | 老叶茶馆
2017/04/15
0
0
HttpClient4.5.2 使用cookie保持会话——连接池的实现结束篇(4)

继上篇HttpClient4.5.2 使用cookie保持会话——如何传递多个cookie(3)之后,本篇我们来介绍如何实现httpclient的连接池管理。 至此,我们对httpclient4.5.2的学习就介绍完了,大家结合之前的...

子群
2016/07/22
527
0
高手问答第 176 期 —— MySQL 8.0 有哪些值得关注的新特性?

OSCHINA 本期高手问答(2017 年 11 月 8 日 — 11 月 14 日)我们请到了@叶金荣 和@吴炳锡和大家一起探讨 MySQL 8.0 有哪些值得关注的新特性。 叶金荣,知数堂培训联合创始人,Oracle MySQL ...

局长
2017/11/07
6.1K
21

没有更多内容

加载失败,请刷新页面

加载更多

Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
1
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
2
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
1
0
Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
3
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部