前面也有一些优化的策略,现在在看看一些优化关于Group BY 语句、 Order By语句 等。
优化GROUP BY语句
默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序。这与在查询中指定ORDER BY col1,col2...类似。因此,如果显式包括一个包含相同的列的ORDER BY子句,则对MySQL的实际执行性能没有什么影响。 如果查询包括GROUP BY 但用户想要避免排序结果的消耗,则可以指定ORDER By NULL禁止排序,例如:
引用
explain select id, sum(moneys) from sales2 group by id \G
explain select id, sum(moneys) from sales2 group by id order by null \G
你可以通过比较发现第一条语句会比第二句在Extra:里面多了Using filesort.而恰恰filesort是最耗时的。
优化ORDER BY语句
在某些情况中,MySQL可以使用一个索引来满足ORDER BY子句,而不需要额外的排序。WHERE 条件和 ORDER BY使用相同的索引,并且ORDER BY的顺序和索引顺序相同,并且ORDER BY的字段都是升序或者都是降序。
例如:
引用
SELECT * FROM t1 ORDER BY key_part1,key_part2,....:
SELECT * FROM t1 WHERE key_part1 = 1 ORDER BY key_part1 DESC,key_part2 DESC;
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;
但是以下的情况不使用索引:
引用
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
--ORDER by的字段混合ASC 和 DESC
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
----用于查询行的关键字与ORDER BY 中所使用的不相同
SELECT * FROM t1 ORDER BY key1, key2;
----对不同的关键字使用ORDER BY
优化嵌套查询
MySQL4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个查询结果作为过滤条件用在另一个查询中,使用子查询可以一次性地完成多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且些起来也很容易。但是,有些情况下,子查询可以被更有效的连接(JOIN)替代。
例如:
引用
explain select * from sales2 where company_id not in(select id from company2) \G
explain select * from sales2 left join comany2 on sales2.company_id = company2.id where sales2.company_id is null \G;
第一句看起来比第二句更简洁,但是第二句比第一就更快。因为使用JOIN来完成这个查询,速度比较快,尤其如果对compay2表中的id建立了索引的话,那么性能将会更好。那为什么在这种情况下使用JOIN会更有效率呢。
因为MySQL不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作。
优化OR条件
对于含有OR的查询子句,如果要利用索引,则OR之间的每个条件列都必须用到索引;如果没有索引,则考虑增加索引。
使用SQL提示
SQL 提示(SQL HINT)是优化数据库的一个重要手段,简单来说就是在SQL语句中加入一些人为的提示来达到优化的操作的目的。
例如:
引用
SELECT SQL_BUFFER_RESULTS * FROM ...
这个语句将强制MySQL生成一个临时结果集。只要临时结果集生成后,所有表上的锁定均被释放。这能在遇到表锁定问题时或者要花很长时间将结果传给客户端时所帮助,因为可以尽快释放锁资源,
下面是一些在MySQL中常用的SQL提示。
引用
1. USE INDEX
在查询语句中表名的后面,添加USE INDEX 来提供希望MySQL去参考的索引列表,就可以让MySQL不再考虑其他可用的索引。
引用
explain select * from sales2 use index (ind_sales2_id) where id 3 \G;
2. IGNORE INDEX
如果用户只是单纯地想让MySQL忽略一个或者多个索引,则可以使用IGNORE INDEX 作为HINT
3. FORCE INDEX
为强制MySQL使用一个特定的索引,可在查询中使用FORCE INDEX作为HINT。例如当不强制使用索引的时候,因为id的值都是大于0的,因为MySQL会默认进行全表扫描,而不使用索引。例如:
引用
expalin select * from sales2 where id > 0 \G;
但是,当使用FORCE INDEX进行提示时,即便使用索引的效率不是很高,MySQL还是选择使用了索引,这是MySQL留给用户的一个自行选择执行计划的权利。加入FORCE INDEX提示后在执行上面的SQL
引用
explain select * from sales2 force index(index_sales2_id) where id > 0 \G;
SQL优化问题是数据库性能优化最基础也是最重要的一个问题,实践表明很多数据库性能问题都是由于不合适的SQL语句造成。一些列的SQL优化描述。怎么定位问题,怎么在编写的时候优化,怎么来应对。不过优化SQL语句经常需要考虑的几个方面,比如索引,表分析,排序等等。
分享到:
相关推荐
2. 基于规则的优化(Rule-Based Optimization, RBO) 基于规则的优化算法是早期数据库系统采用的主要优化方法。RBO遵循一系列预定义的优化规则,如消除冗余操作、合并相似操作、重写查询语句等。当遇到一个查询时,...
三、数据库优化方案 根据不同的应用场景和需求,达梦数据库可以采取不同的优化方案,例如: 1. 对于高并发的应用,通过调整系统缓冲区和内存公共内存池的大小和数量,可以提高数据库的并发效率和性能。 2. 对于大...
接下来,"数据库SQL优化总结之百万级数据库优化.pdf"可能深入到实际的优化实践。 1. **数据库架构设计**:在百万级数据量下,合理的设计能避免性能瓶颈,如垂直分割、水平分割,以及读写分离策略。 2. **缓存与...
2. 数据库查询的重要性和挑战 3. 遗传算法在数据库查询优化中的应用 4. 实时数据库规则在数据库查询优化中的应用 5. 基于遗传算法和实时数据库规则的数据库查询优化方案设计 相关术语: * 遗传算法 * 实时数据库 *...
2. **MySQL性能优化** - **InnoDB存储引擎**:选择支持行级锁定的InnoDB引擎,以降低锁定冲突。 - **分区表**:对大表进行分区,可以分散I/O负载,提高查询速度。 - **MyISAM与InnoDB对比**:根据读写需求选择...
标题“SYBASE数据库性能优化”指出我们关注的核心是针对SYBASE数据库进行性能提升的技术和策略。这通常涉及到SQL查询优化、索引管理、内存配置、存储规划等多个方面。描述中提到这是一个硕士学位毕业论文,属于软件...
数据库性能优化是IT领域中的重要话题...《Oracle9i 数据库性能优化 V 1.pdf》和《Oracle9i 数据库性能优化 V 2.pdf》这两份文档应该会提供更详细的操作步骤和案例分析,对于理解和实施这些优化措施具有极大的指导价值。
Oracle数据库性能优化是确保系统高效运行的关键环节,尤其是在大数据量和高并发的环境中。Oracle数据库因其先进、完整和集成的特性,在市场中占据主导地位,因此深入理解和掌握Oracle的优化技术至关重要。 首先,...
数据库SQL优化大总结之百万级数据库优化方案 本文总结了数据库SQL优化的十一个重要知识点,以帮助开发者提高SQL查询效率,避免全表扫描。 一、数据库SQL优化之索引优化 1. 在where及order by涉及的列上建立索引,...
### 数据库查询优化的核心知识点 #### 一、查询优化的重要性 数据库查询优化是数据库管理系统(DBMS)中的关键组件,其目标在于选择最有效的查询...随着技术的不断进步,查询优化将继续成为数据库领域研究的热点之一。
2. 查询优化:查询优化是指对查询语句进行调整和优化,以提高查询效率。常见的查询优化技术包括重新编写查询语句、使用索引、限定查询范围、避免使用 SELECT \* 等。 3. 数据库设计优化:数据库设计优化是指对...
### 分布式数据库查询优化详解 #### 一、背景与挑战 随着信息技术的快速发展和各行各业对数据处理需求的增加,数据库系统面临着前所未有的挑战。一方面,数据量的急剧增长要求数据库具备更高的存储能力和更快的...
数据库优化工具在这一过程中也起着重要作用。ORACLE提供了各种工具,如SQL*Plus、DBMS_XPlan、AWR(Automatic Workload Repository)和ASH(Active Session History),帮助管理员分析性能瓶颈,生成执行计划,监控...
#### 3.1 数据库优化 包括但不限于以下方面: - **收缩数据库**:减少数据库占用的空间,释放未使用的存储资源。 - **清除日志**:定期清理过期的日志记录,减少日志文件的大小。 - **重建索引碎片**:当索引变得...
通常,我们按照函数依赖将规范化分为5个级别:1NF(第一范式)、2NF(第二范式)、3NF(第三范式)、BCNF(博科斯范式)和4NF(第四范式)。每个更高级别的范式旨在解决特定的问题,如消除部分依赖和传递依赖。在...
#### 二、数据库设计中的性能优化 数据库性能优化可以从多个层面入手,其中包括数据库的设计阶段。在设计数据库时,应综合考虑功能需求和性能需求,确保最终的设计能够高效地满足业务需求。 ##### 2.1 规范化设计 ...
- **规范化设计**:遵循数据库逻辑设计的范式,如第一范式(无重复组)、第二范式(非关键字段依赖主键)和第三范式(消除传递依赖)。适当规范化可减少数据冗余,提高性能。 - **合理冗余**:完全规范化可能导致...
MySQL 数据库性能优化是当前数据库管理系统中最重要的研究领域之一。随着互联网技术的快速发展,MySQL 数据库被广泛应用于各种业务场景。然而,当数据库规模不断扩大,查询复杂度增加时,性能问题逐渐凸显。本文将...