赞
踩
目录
什么情况下用 SELECT*,如何提升 SELECT 查询效率?
下面列举一些常见的关键字使用方法,及注意事项。
LIMIT关键字,有一点需要注意,约束返回结果的数量,在不同的 DBMS 中使用的关键字可能不同。
在 MySQL、PostgreSQL、MariaDB 和 SQLite 中使用 LIMIT 关键字,而且需要放到 SELECT 语句的最后面。如果是 SQL Server 和 Access,需要使用 TOP 关键字
约束返回结果的数量可以减少数据表的网络传输量,也可以提升查询效率。
如果我们知道返回结果只有 1 条,就可以使用LIMIT 1,告诉 SELECT 语句只需要返回一条记录即可。这样的好处就是 SELECT 不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。
-
- SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
(在 MySQL 和 Oracle 中,SELECT 执行顺序基本相同)
-
- FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT
例如下面sql语句每一个步骤都会产生一个虚拟表来作为下一步的输入集合,这个过程我们是不可见的
-
- SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
- FROM player JOIN team ON player.team_id = team.team_id #顺序1
- WHERE height > 1.80 #顺序2
- GROUP BY player.team_id #顺序3
- HAVING num > 2 #顺序4
- ORDER BY num DESC #顺序6
- LIMIT 2 #顺序7
SELECT*意味着全表扫描,我们知道,全表扫描意味着全量I/O会带来巨大的性能开销。真实的业务场景中,我们很少用全表数据,更多的是部分字段,就算是需要查更多的数据也是分页查询,不会查全量。所以我们尽可能在SELECT后面写选择的列名。
InnoDB存储引擎中COUNT(*)和COUNT(1),有WHERE子句,则是对所有符合筛选条件的数据行进行统计。如果没有WHERE子句,则是对数据表的数据行数进行统计其实都是用了全表扫描
可以看到两个的执行计划都一模一样,都用到了主键索引(聚簇索引) ,都是全表扫描69行,时间复杂度都是O(n)。如果对具体的行进行查询,聚簇索引的查询效率肯定是最高的。但对于count这种不是对具体行的查询用二级索引会比较合适,二级索引包含的信息会比较少,占的空间会比较少。多个二级索引会选择key_len比较小的二级索引。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。