- 浏览: 599304 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了。另一个是把结果选好之后再排序。
用有序索引这种,当然是最快的,不过有一些限制条件,来看下面的测试。
测试数据:student表有两个字段id ,sid ,id是主键。一共有20W条记录,id从1到200000,sid也是从1到200000的数据。
第一种情况 :
order by的字段不在where条件也不在select中
select sid from zhuyuehua.student where sid < 50000 order by id;
第二种情况 :
order by的字段不在where条件但在select中。
select id,sid from zhuyuehua.student where sid < 50000 order by id;
第三种情况 :
order by的字段在where条件但不在select中。
select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id;
第四种情况 :
order by的字段在where条件但不在select中。倒序排列
select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc;
测试结果:
order by的字段不在where条件不在select中 有排序操作
order by的字段不在where条件但在select中 有排序操作
order by的字段在where条件但不在select中 无排序操作
order by的字段在where条件但不在select中(倒序) 无排序操作
结论:
当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。
分析:
为什么只有order by 字段出现在where条件中时,才会利用该字段的索引而避免排序。这要说到数据库如何取到我们需要的数据了。
一条SQL实际上可以分为三步。
1.得到数据
2.处理数据
3.返回处理后的数据
比如上面的这条语句select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc
第一步:根据where条件和统计信息生成执行计划,得到数据。
第二步:将得到的数据排序。
当执行处理数据(order by)时,数据库会先查看第一步的执行计划,看order by 的字段是否在执行计划中利用了索引。如果是,则可以利用索引顺序而直接取得已经排好序的数据。如果不是,则排序操作。
第三步:返回排序后的数据。
另外:
上面的5万的数据sort只用了25ms,也许大家觉得sort不怎么占用资源。可是,由于上面的表的数据是有序的,所以排序花费的时间较少。如果 是个比较无序的表,sort时间就会增加很多了。另外排序操作一般都是在内存里进行的,对于数据库来说是一种CPU的消耗,由于现在CPU的性能增强,对 于普通的几十条或上百条记录排序对系统的影响也不会很大。但是当你的记录集增加到上百万条以上时,你需要注意是否一定要这么做了,大记录集排序不仅增加了 CPU开销,而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降。
注:ORACLE或者DB2都有一个空间来供SORT操作使用(上面所说的内存排序),如ORACLE中是用户全局区(UGA),里面有SORT_AREA_SIZE等参数的设置。如果当排序的数据量大时,就会出现排序溢出(硬盘排序),这时的性能就会降低很多了。
总结:
当order by 中的字段出现在where条件中时,才会利用索引而不排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。
这个结论不仅对order by有效,对其他需要排序的操作也有效。比如group by 、union 、distinct等。
用有序索引这种,当然是最快的,不过有一些限制条件,来看下面的测试。
测试数据:student表有两个字段id ,sid ,id是主键。一共有20W条记录,id从1到200000,sid也是从1到200000的数据。
第一种情况 :
order by的字段不在where条件也不在select中
select sid from zhuyuehua.student where sid < 50000 order by id;
第二种情况 :
order by的字段不在where条件但在select中。
select id,sid from zhuyuehua.student where sid < 50000 order by id;
第三种情况 :
order by的字段在where条件但不在select中。
select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id;
第四种情况 :
order by的字段在where条件但不在select中。倒序排列
select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc;
测试结果:
order by的字段不在where条件不在select中 有排序操作
order by的字段不在where条件但在select中 有排序操作
order by的字段在where条件但不在select中 无排序操作
order by的字段在where条件但不在select中(倒序) 无排序操作
结论:
当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。
分析:
为什么只有order by 字段出现在where条件中时,才会利用该字段的索引而避免排序。这要说到数据库如何取到我们需要的数据了。
一条SQL实际上可以分为三步。
1.得到数据
2.处理数据
3.返回处理后的数据
比如上面的这条语句select sid from zhuyuehua.student where sid < 50000 and id < 50000 order by id desc
第一步:根据where条件和统计信息生成执行计划,得到数据。
第二步:将得到的数据排序。
当执行处理数据(order by)时,数据库会先查看第一步的执行计划,看order by 的字段是否在执行计划中利用了索引。如果是,则可以利用索引顺序而直接取得已经排好序的数据。如果不是,则排序操作。
第三步:返回排序后的数据。
另外:
上面的5万的数据sort只用了25ms,也许大家觉得sort不怎么占用资源。可是,由于上面的表的数据是有序的,所以排序花费的时间较少。如果 是个比较无序的表,sort时间就会增加很多了。另外排序操作一般都是在内存里进行的,对于数据库来说是一种CPU的消耗,由于现在CPU的性能增强,对 于普通的几十条或上百条记录排序对系统的影响也不会很大。但是当你的记录集增加到上百万条以上时,你需要注意是否一定要这么做了,大记录集排序不仅增加了 CPU开销,而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降。
注:ORACLE或者DB2都有一个空间来供SORT操作使用(上面所说的内存排序),如ORACLE中是用户全局区(UGA),里面有SORT_AREA_SIZE等参数的设置。如果当排序的数据量大时,就会出现排序溢出(硬盘排序),这时的性能就会降低很多了。
总结:
当order by 中的字段出现在where条件中时,才会利用索引而不排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。
这个结论不仅对order by有效,对其他需要排序的操作也有效。比如group by 、union 、distinct等。
发表评论
文章已被作者锁定,不允许评论。
-
sql 查询一些基础数据(不经常变)关联关系时可以把关联关系写入到表中
2018-04-16 15:18 440原来的查询语句 FROM table1 t LEFT ... -
sql 最小化表查询次(col1,col2) = (select col1,col2 from t)
2018-01-02 16:51 555最小化表查询次数 ... -
sql 用inner join取代in和exists
2018-01-02 16:48 1155使用表连接替换EXISTS ... -
oracle HINT详解
2017-09-01 10:42 524ORACLE的HINT详解 hints是oracle提供的 ... -
oracle jdbctemplate如何优化查询速度
2017-08-21 09:33 13251.设置setFetchSize进行优化 // 可以优化 ... -
oracle Parallel模式-Parallel用法(/*+PARALLEL(n)*/)
2017-08-18 16:48 19211.用途 强行启用 ... -
oracle where条件分支查询
2016-06-30 16:16 524select * from test xx where ... -
oracle 重复数据处理的sql整理
2016-06-22 14:44 405Oracle 删除重复数据只留一条 1、查找表中多余的重 ... -
oracle 常用sql语句积累
2016-01-28 11:01 5721.删除重复列 delete from t t1 where ... -
oracle 表中有子父关系列则使用CONNECT BY PRIOR
2014-10-27 10:08 423查询名字为xx xxx的所有子数据 SELECT re.U ... -
oracle 删除大量数据后整理表(analyze table xxx compute statistics)
2014-10-17 18:09 22311. DELETE 后 TRUNCATE TABLE ; 然 ... -
oracle 高效Sql语句总结
2014-10-08 11:23 505No SQL,No cost. SQL语句是造成数据库 ... -
oracle join关键字使用总结
2014-06-17 13:57 6001.内连接:选出两个表中所有符合连接条件的row构成的集合。 ... -
sql like与索引(后模糊匹配才能让索引有效)
2014-06-15 20:12 1731索引与优化like查询 1. like %keyword ... -
oracle exists 和not exists 用法详解
2014-06-15 16:17 540有两个简单例子,以说明 “exists”和“in”的效率问题 ... -
sql 数据库索引的使用规则
2014-06-15 14:49 1030使用索引前需要用explain查看下执行计划,然后根据基数是否 ... -
几种范式详解
2014-05-04 10:46 515数据库的设计范式是数 ... -
oracle sql语句优化总结
2013-06-19 16:45 6221.直接路径读方式 --直接路径读方式 drop ta ...
相关推荐
在实际操作中,`ORDER BY`常与其他SQL子句(如`GROUP BY`, `JOIN`等)结合使用,以满足复杂的数据查询需求。通过理解并熟练掌握`ORDER BY`多字段排序,可以更好地对数据库中的数据进行管理和分析。 总之,`ORDER BY...
在设计表的索引时,应该考虑到未来SQL查询的模式,包括哪些字段将用于过滤(WHERE子句)、排序(ORDER BY)以及分组(GROUP BY)。通过合理设计两到三个索引,可以覆盖大多数的查询需求,确保常用的SQL语句都能利用...
- 为经常出现在WHERE子句中的列创建索引。 - 对于频繁使用的JOIN操作中的关联列建立索引。 - 考虑使用复合索引来同时优化多个列的查询性能。 2. **减少全表扫描:** - 使用WHERE子句过滤记录,避免不必要的全表...
- `SELECT * FROM 表名 WHERE 字段名 LIKE '%字段值%' ORDER BY 字段名 [DESC]`:与上面类似,但是这里使用了`LIKE`操作符来实现模糊匹配。 - 示例:`SELECT * FROM Customers WHERE FirstName LIKE '%a%' ORDER ...
比如,当`ORDER BY`的字段完全包含在索引中,或者与`WHERE`子句中的条件匹配时,MySQL可以高效地利用索引。以下是一些能够使用索引优化`ORDER BY`的例子: 1. 查询按索引完全顺序排列的数据: ```sql SELECT * ...
- 如果必须使用`ORDER BY`,尝试将排序字段设置为索引的一部分。 5. **使用NOT EXISTS代替NOT IN**: - `NOT IN`在某些情况下会导致索引失效。 - 示例:`SELECT * FROM A WHERE A.id NOT IN (SELECT B.id FROM B)...
3. **使用WHERE子句**:在WHERE子句中使用索引字段,避免在这些字段上使用不等运算符(如、NOT IN、BETWEEN等)和函数,因为这可能导致索引无法被有效利用。 4. **分组和排序**:GROUP BY和ORDER BY操作可能会导致...
这两种方法可以有效帮助数据库管理员识别出那些碎片率较高的索引,根据`avg_fragmentation_in_percent`字段,如果该值大于50%,通常建议对该索引进行重建。 ### 索引重建方式 在确认需要重建的索引后,接下来是...
- **分组和排序**:在使用GROUP BY和ORDER BY子句时,索引可以减少分组和排序的时间。 - **优化隐藏器**:通过索引,查询处理器可以更好地优化SQL语句,提高系统性能。 - **缺点** - **创建和维护成本**:随着...
SELECT [字段名列表] FROM [表名] [WHERE 条件] [GROUP BY 字段名] [HAVING 条件] [ORDER BY 字段名] [LIMIT 条件] 其中: * SELECT 说明要查询的数据 * FROM 说明要查询的数据来自那个或那些表 * WHERE 说明查询...
SQL(Structured Query Language)是用于管理和处理关系型数据库的标准语言。在本篇内容中,我们将深入探讨如何使用SQL进行表和字段的基本操作,包括添加、删除和修改字段,以及数据库对象的重命名和查询。这些操作...
- 经常用于排序(ORDER BY)、分组(GROUP BY)或过滤(WHERE子句)的列应该创建索引。 - 数据列的更新频率高或值变化大的列不适合建立索引,因为这会增加索引维护的成本。 - 文本、图像和位类型的数据列以及重复值...
一、适合用索引的场景 ...这里要注意,order by的字段出现在where条件中才能使用索引,否则索引失效。 5、查询中的统计、分组字段 group by和union也属于需要排序的操作,这里也要注意字段出现在whe
例如,在 MySQL SQL 中,`where` 条件中的字符串类型可以隐式转换为数字类型,但这可能会造成索引不起效和非预期的结果。 聚合函数 Presto SQL 和 MySQL SQL 都支持聚合函数,如 `count()`、`sum()`、`avg()` 等。...
SELECT * FROM Table1 WHERE Data1 = 2 ORDER BY DTAt DESC; ``` 假设执行后得到的结果如下: ``` Table 'Table1'. Scan count 1, logical reads 911, physical reads 0, read-ahead reads 0, lob logical reads 0...
通常来说,这些字段包括`WHERE`子句中的条件字段、`SELECT`列表中的返回字段以及`ORDER BY`或`DISTINCT`后的字段。 2. **选择合适的字段顺序**: - 字段的顺序对于索引的性能至关重要。通常将过滤条件字段作为索引...
- **建立索引**:在WHERE和ORDER BY子句中涉及的列上建立索引。 - **使用合适的索引类型**:例如,使用唯一索引或者主键索引来加速查询。 **2. 避免NULL值判断** 在WHERE子句中直接对字段进行NULL值判断(如 `...
SELECT <字段列表> FROM <数据源> WHERE <条件> ORDER BY <字段列表> 例如: SELECT 学号, 成绩 FROM 成绩表 WHERE 课程ID=“001” AND 成绩>60 ORDER BY 成绩 DESC; ### 带 FROM、GROUP BY 和 HAVING 子句的 ...
选择那些经常出现在JOIN、WHERE、ORDER BY、GROUP BY等SQL子句中的字段作为索引字段。 - 对于小表,尤其是查找表,使用索引可能反而降低性能,直接扫描表可能更快。 4. **多字段索引**: - 多字段索引适用于那些...
1. 在where及order by涉及的列上建立索引,以避免全表扫描。 二、数据库SQL优化之避免NULL值 2. 尽量避免在where子句中对字段进行NULL值判断,以免引擎放弃使用索引而进行全表扫描。 三、数据库SQL优化之避免!=和...