文档章节

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 等,都是为了避免这些耗时的操作阻塞了程序,减少用户的...

章鱼喵_
2018/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
高手问答第 176 期 —— MySQL 8.0 有哪些值得关注的新特性?

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

局长
2017/11/07
7.1K
21
Mysql 多表联合查询效率分析及优化

多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如: [sql]view plaincopyprint? SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM......

蓝狐乐队
2014/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

全面理解Java内存模型(JMM)及volatile关键字

理解Java内存区域与Java内存模型 Java内存区域 Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的...

亭子happy
21分钟前
1
0
Prometheus监控mysql实例--centos7安装mysql_exporter

目录 概述 环境准备 普罗米修斯简介 mysql安装 mysqld_exporter安装 启动参数列表 概述 prometheus(普罗米修斯) 是一个开源系统监控和报警工具包,许多公司和组织都采用了Prometheus,该项目...

java_龙
27分钟前
4
0
拥有2000家门店,他如何晋升为服装界的新宠?

摘要: —— iwarm3.0加热组件、碳纳米管膜炎、管状石墨结构体...你看到并不是一款高科技电子产品,这是快鱼服饰在这个冬天推出的黑科技产品 - 智能温控羽绒服。 在竞争激烈的服装行业,快鱼...

阿里云云栖社区
29分钟前
2
0
不忘初心 砥砺前行-智和信通2018年年会报道

1月18日,智和信通以“不忘初心 砥砺前行”为主题的2018总结会议暨2019年年会在京召开。年会以总经理李少龙的讲话为开场,充分肯定了全体员工2018年的工作和成绩,并表达了公司产品智和网管平...

智和网管平台
37分钟前
1
0
NGINX api网关

nginx配置 vi nginx.conf include /usr/local/nginx/conf/api/gateway.conf; # 所有的API网关配置 include /usr/local/nginx/conf/vhosts/*.conf; # 正常web域名配置......

以谁为师
39分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部