一、查询为什么慢
网络,CPU计算,生成的统计信息,执行技术,锁等待,IO等待等。
二、慢查询优化访问
低效查询的处理办法:
- 确认是否访问了太多行,或者太多列
- 是否分析了大量的数据
问题及应对办法
- 查询不需要的记录:使用Limit
- 避免select *,会影响索引覆盖扫描
- 避免重复查询相同的数据
WHERE语句的三种使用方式
- 存储引擎直接使用WHERE过滤无效字段
- 使用索引扫描,在索引中过滤无效字段(Extra出现Using Index)
- 返回所有数据然后WHERE过滤(Extra中出现Using Where)
查询大量数据返回少量行是可以考虑的技巧
- 使用覆盖索引
- 修改库表结构例如增加汇总表
- 重写复杂查询
三、重构查询方式
考虑使用一个复杂查询还是多个简单查询
切分查询
- 将服务器的压力分散到一个时间段
分解关联查询
- 让缓存的效率更高
- 执行单个查询可以减少所得争用问题
- 更易拆分数据表,更容易做到高性能和可扩展
- 可能让MySQL按照ID进行顺序查询,而不是随机关联
- 可以减少冗余数据的查询
- 相当于在应用中实现了HASH关联,而不是使用MySQL的嵌套循环关联
四、查询执行基础
查询执行流程
- 服务器接收一条查询命令
- 如果有查询缓存直接返回结果,否则进入下一阶段
- SQL解析,预处理
- 优化器生成对应的执行计划
- 根据执行计划调用存储引擎API,完成查询
- 将结果返回
查询缓存
使用大小写敏感的hash查找实现,只要查询语句有一点改变,就不会被命中。再此期间还会确认一遍用户的权限。这时候查询语句并未被解析,所以也就解释好了where a>2执行完之后where a>1+1不会被缓存命中的原因。
MySQL执行关联策略
MySQL对任何关联都执行嵌套关联操作。
- MySQL先在一个表中循环取出单条数据
- 然后再嵌套循环到下一个表中寻找匹配的行
- 依次下去直到找到所有表中匹配的行为止
- 然后根据根据各个表匹配的行,返回查询中需要的列
- MySQL会根据相应的优化策略优化关联的顺序,使遍历多表达到较好的效果
查看重构查询
对该查询执行
explain select * from t1;
之后执行
show warning;
排序优化
- 旧:读取行指针和需要排序的字段,对其 进行排序,然后在根据排序结果读取所需要的行
- 新:先读取查询所需要的所有的列,然后再根据给定列进行排序,最后直接返回排序结果
-
比较:
- 优点:只需要一次顺序IO,比起两次IO(其中还有一次随机IO)有了很大优势
- 缺点:引入很多无用的列,白白占用着内存,对排序无影响
-
文件排序:
- 对每一个排序记录都会分配一个足够长的定长空间来存放,有时排序占用的空间比数据存储占用的空间还要多
- 对于关联查询来数order by子句中所有的列都来自于第一个表,那么MySQL在关联第一张表的时候就进行文件排序(Extra中可看到Using Filesort)
- 否则会先将关联的结果放到临时表中,然后在所有表都关联完成后再进行文件排序,5.6版本之后可以将Limit提前执行,避免了排序大量的数据到最后只需要很少的尴尬处境
相关推荐
### MySQL查询优化浅析 #### 重要概念:查询优化 查询优化是数据库管理系统(DBMS)中的关键组件之一,其核心目标在于寻找最有效的查询执行计划,以最小化资源消耗(如CPU时间、I/O操作)并加快数据检索速度。在...
MySQL查询优化技术_索引
3. 进行基于规则的优化,这是一系列预定义的转换操作,用来优化查询语句。 4. 开展基于成本的优化,也称为统计式优化,这是最复杂且最有决定性的一步。优化器会考虑多种可能的执行计划,并为每个计划计算一个成本...
- **避免全表扫描**:通过优化查询语句,减少不必要的全表扫描,例如,避免在WHERE子句中使用NOT IN、!=、等操作符。 - **监控和分析**:定期检查EXPLAIN计划,分析索引的使用情况,使用MySQL的性能分析工具如pt-...
查询优化可以通过优化索引、优化查询语句和优化数据库结构来实现。OLTP 和 OLAP 是两种不同的查询优化方法,OLTP 适用于在线事务处理,而 OLAP 适用于在线分析处理。 OLTP 和 OLAP OLTP 和 OLAP 是两种不同的查询...
### MySQL查询优化技术详解 #### 引言:MySQL查询优化的重要性 在当今互联网时代,网站的速度直接影响用户体验和业务效果。数据库查询效率成为决定网站响应速度的关键因素之一。MySQL作为广泛使用的开源关系型...
接着,"MySQL查询优化系列讲座之数据类型与效率"强调了正确选择数据类型对于优化查询的重要性。不同数据类型占用的空间、存储效率以及参与计算的方式都不同,选择合适的数据类型可以减少存储需求,提高查询速度。这...
MySQL查询优化器是数据库管理系统中的核心组件,负责解析SQL语句并制定出执行查询的最佳计划。这个过程涉及多个阶段,包括解析、预处理、优化和执行。本资料“Mysql查询优化器.rar”包含了对这一关键主题的深入探讨...
4. **减少临时表的使用**:尽量避免在复杂的查询中创建临时表,可以通过优化查询结构或者使用内存临时表来改善性能。 5. **合理使用GROUP BY和ORDER BY**:这两个操作可能导致排序,消耗大量资源。如果可能,应先...
### MySQL 查询优化的关键知识点 #### 1. 理解MySQL如何优化LEFT JOIN 在MySQL中,`A LEFT JOIN B` 的实现主要包括以下几个步骤: - **表B依赖于表A**:这意味着表B的处理顺序依赖于表A的存在,确保在处理B之前,A...
MySQL查询优化是数据库管理中至关重要的一个环节,其目的是通过找到执行SQL语句的最佳路径,以提高查询效率,减少资源消耗。在这个过程中,查询优化器起着核心作用,它会根据代价模型来评估不同的执行计划,并选择...
其次,优化查询语句结构是另一个关键环节。避免在WHERE子句中使用不等式或复杂的表达式,这可能导致无法利用索引。尽量使用JOIN操作替代子查询,因为JOIN的执行计划可能更高效。同时,避免使用SELECT *,明确指定...
在执行查询时,MySQL优化器会根据统计信息和查询条件选择最佳的索引。 对于复杂查询优化,比如涉及多个表连接的查询,应考虑使用连接顺序、索引覆盖和子查询优化等策略。连接顺序对查询性能影响很大,MySQL会选择...
7. **查询优化技巧**:除了索引,还可以通过其他方式优化查询,比如减少子查询、避免在WHERE子句中使用函数、使用EXPLAIN分析查询计划等。理解数据库查询执行的逻辑可以帮助找出性能瓶颈。 8. **存储引擎的选择**:...
Mysql查询优化,查询优化器,子查询,分页查询1)在执行计划1中,哪张表是驱动表? 表的连接顺序是怎样的?每一步表的扫描类型是什么? 2)在执行计划2中,表的执行顺序是怎样的?每一步表的扫描类型是什么? 3)在...