文档章节

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
HttpClient4.5.2 使用cookie保持会话——连接池的实现结束篇(4)

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

子群
2016/07/22
527
0
2018年swoole实战5-异步mysql

继上篇 2018年swoole实战4-异步io读写 本篇演示 swoole的异步mysql 模拟数据 在本地test数据库中新建book表,写入模拟数据 异步mysql 执行结果 连接时长 默认情况下,mysql的等待连接时长为1...

章鱼喵_
07/27
0
0
高手问答第 176 期 —— MySQL 8.0 有哪些值得关注的新特性?

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

局长
2017/11/07
6.1K
21

没有更多内容

加载失败,请刷新页面

加载更多

FinderWeb2.4.9 程序员的看日志利器

FinderWeb2.4.9 程序员的看日志利器 使用方法:管理员登录,分配对应用户的的主机和文件权限即可。 部署方式: 下载并解压到webapps目录即可 http://www.finderweb.net/download/finder-web...

吴伟祥
14分钟前
0
0
PHP的pcntl进程控制教程一(pcntl_fork)

pcntl 简介 PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 这份文档...

hansonwong
19分钟前
0
0
php扩展模块安装

11月21日任务 11.32 php扩展模块装安装 /usr/local/php/bin/php -m //查看模块 下面安装一个redis的模块 cd /usr/local/src/ wget https://codeload.github.com/phpredis/phpredis/zip/deve......

zgxlinux
19分钟前
2
0
windows下使用IDEA创建VUE项目

1.环境搭建 1.1检测是否安装好nodejs和npm 检测命令 node -v npm -v 如果没有安装需要先安装 nodejs的下载路径:https://nodejs.org/en/download/ 在Windows上安装时务必选择全部组件,包括勾...

文文1
27分钟前
2
0
Mybatis插件plugin应用测试,替换查询sql

1、新建插件 import org.apache.ibatis.executor.CachingExecutor;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.executor.parameter.ParameterHandler;im......

jcc_codingBoy
31分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部