文档章节

MySQL查询优化

w
 wangxiao870709
发布于 2016/04/24 11:08
字数 1028
阅读 5
收藏 0

一、查询为什么慢

网络,CPU计算,生成的统计信息,执行技术,锁等待,IO等待等。

二、慢查询优化访问

低效查询的处理办法:

  1. 确认是否访问了太多行,或者太多列

  2. 是否分析了大量的数据


问题及应对办法

  1. 查询不需要的记录:使用Limit

  2. 避免select *,会影响索引覆盖扫描

  3. 避免重复查询相同的数据


WHERE语句的三种使用方式

  1. 存储引擎直接使用WHERE过滤无效字段

  2. 使用索引扫描,在索引中过滤无效字段(Extra出现Using Index)

  3. 返回所有数据然后WHERE过滤(Extra中出现Using Where)


查询大量数据返回少量行是可以考虑的技巧

  1. 使用覆盖索引

  2. 修改库表结构例如增加汇总表

  3. 重写复杂查询


三、重构查询方式

考虑使用一个复杂查询还是多个简单查询


切分查询

  1. 将服务器的压力分散到一个时间段


分解关联查询

  1. 让缓存的效率更高

  2. 执行单个查询可以减少所得争用问题

  3. 更易拆分数据表,更容易做到高性能和可扩展

  4. 可能让MySQL按照ID进行顺序查询,而不是随机关联

  5. 可以减少冗余数据的查询

  6. 相当于在应用中实现了HASH关联,而不是使用MySQL的嵌套循环关联

四、查询执行基础

查询执行流程

  1. 服务器接收一条查询命令

  2. 如果有查询缓存直接返回结果,否则进入下一阶段

  3. SQL解析,预处理

  4. 优化器生成对应的执行计划

  5. 根据执行计划调用存储引擎API,完成查询

  6. 将结果返回


查询缓存

  使用大小写敏感的hash查找实现,只要查询语句有一点改变,就不会被命中。再此期间还会确认一遍用户的权限。这时候查询语句并未被解析,所以也就解释好了where a>2执行完之后where a>1+1不会被缓存命中的原因。


MySQL执行关联策略

MySQL对任何关联都执行嵌套关联操作。

  • MySQL先在一个表中循环取出单条数据

  • 然后再嵌套循环到下一个表中寻找匹配的行

  • 依次下去直到找到所有表中匹配的行为止

  • 然后根据根据各个表匹配的行,返回查询中需要的列

  • MySQL会根据相应的优化策略优化关联的顺序,使遍历多表达到较好的效果


查看重构查询

对该查询执行

explain select * from t1;

之后执行

show warning;

排序优化

  1. 旧:读取行指针和需要排序的字段,对其 进行排序,然后在根据排序结果读取所需要的行

  2. 新:先读取查询所需要的所有的列,然后再根据给定列进行排序,最后直接返回排序结果

  3. 比较:

    • 优点:只需要一次顺序IO,比起两次IO(其中还有一次随机IO)有了很大优势

    • 缺点:引入很多无用的列,白白占用着内存,对排序无影响

  4. 文件排序:

    • 对每一个排序记录都会分配一个足够长的定长空间来存放,有时排序占用的空间比数据存储占用的空间还要多

    • 对于关联查询来数order by子句中所有的列都来自于第一个表,那么MySQL在关联第一张表的时候就进行文件排序(Extra中可看到Using Filesort)

    • 否则会先将关联的结果放到临时表中,然后在所有表都关联完成后再进行文件排序,5.6版本之后可以将Limit提前执行,避免了排序大量的数据到最后只需要很少的尴尬处境


获取【下载地址】  java大数据 高并发 系统框架 springmvc mybatis Bootstrap html5 shiro maven SSM 


© 著作权归作者所有

w
粉丝 0
博文 3
码字总数 2975
作品 0
南宁
私信 提问
第六章 查询性能优化 高性能MySql阅读总结

前面的章节我们介绍了如何设计最优的库表结构、 如何建立最好的索引, 这些对于高性能来说是必不可少的。 但这些还不够一一还需要合理的设计查询。 如果查询写得很糟糕,即使库表结构再合理、...

好好学习Sun
2018/07/09
0
0
MySQL探秘(二):SQL语句执行过程详解

 昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦是如此,只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化。  当希望MySQL能够以更高的...

ztelur
2018/08/12
0
0
「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)

【mysql优化专题】:本专题全文围绕mysql优化进行全方位讲解,本篇为优化入门篇,让大家知道为什么要优化,究竟在优化什么。喜欢的朋友可以关注收藏。 优化,一直是面试最常问的一个问题。因...

java进阶架构师
2017/11/16
0
0
《高性能MySQL》读书笔记之MySQL 优化

关于MySQL的执行过程: 1 MySQL中存在对SQL语句的改写,通过改写SQL达到优化SQL语句的目的,如将子查询改为关联查询. 2 MySQL并没有像Oracle 11g那样缓存执行计划,在Java开发中PreparedStateme...

周翔
2016/11/02
28
0
mysql中SQL执行过程详解

mysql执行一个查询的过程,到底做了些什么: 客户端发送一条查询给服务器; 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。 服务器段进行SQL解析...

echojson
04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库

数据库架构 数据库架构可以分为存储文件系统和程序实例两大块,而程序实例根据不同的功能又可以分为如下小模块。 1550644570798 索引模块 常见的问题有: 为什么要使用索引 什么样的信息能成...

一只小青蛙
今天
4
0
PHP常用经典算法实现

<? //-------------------- // 基本数据结构算法 //-------------------- //二分查找(数组里查找某个元素) function bin_sch($array, $low, $high, $k){ if ( $low <= $high){ $mid = int......

半缘修道半缘君丶
昨天
5
0
GIL 已经被杀死了么?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/8KvQemz0SWq2hw-2aBPv2Q 花下猫语: Python 中最广为人诟病的一点,大概就是它的 GIL 了。...

豌豆花下猫
昨天
5
0
git commit message form

commit message一般包括3部分:Header、Body、Footer。 <type>(<scope>):<subject>blank line<body>blank line<footer> header是必需的,body、footer可以省略。 header中type、subject......

ninjaFrog
昨天
5
0
聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部