sql - SQL:WHERE 子句可以提高 SELECT DISTINCT 查询的速度吗?
问题描述
所以这是具体情况:我为数据库中的每个条目设置了主唯一索引键,但每一行都有一个引用条目属性的 secondID,因此,secondID不是唯一的。这些行还有另一个属性,我们称之为isTitle,默认为NULL,但每组具有相同secondID的条目至少有一个条目的isTitle值为 1。
考虑到上述情况,WHERE子句是否会提高查询的处理速度?请参阅以下内容:
SELECT DISTINCT secondID FROM table;
对比
SELECT DISTINCT secondID FROM table WHERE isTitle = 1;
编辑:
没有 WHERE 子句的第一个查询更快,但有人能解释一下为什么吗?从算法上讲,这个过程应该更快,在循环中只有一个“如果”,不是吗?
解决方案
这是一个很难回答的问题,尤其是在没有指定数据库的情况下。以下是三个重要的考虑因素:
- 数据库引擎会使用索引
secondID
吗select distinct
?任何体面的数据库优化器都应该,但这并不意味着所有的都可以。 - 表相对于索引有多宽?也就是说,扫描索引真的比扫描表快得多吗?
isTitle = 1
与具有相同值的所有行的比率是secondId
多少?
对于第一个查询,基本上有两种处理查询的方法:
- 扫描索引,获取每个唯一值。
- 扫描表,对表进行排序或散列,然后选择唯一值。
如果不明显,(1)比(2)快得多,除非在行数较少的琐碎情况下。
对于第二个查询,唯一真正的选择是:
- 扫描表,过滤掉不匹配的值,对表进行排序或散列,并选择唯一值。
这里的关键问题是需要扫描多少数据以及过滤掉多少数据。甚至有可能——例如,如果你有无数行secondaryId
,没有额外的列,以及少量的值——这可能与上面的 (1) 相当或略快。扫描索引有一点开销,对少量数据进行排序通常很快。
而且,这种方法几乎肯定比(2)快。
正如评论中提到的,您应该使用您的数据测试系统上的查询(使用合理数量的数据!)。或者,更新表统计信息并学习阅读执行计划。
推荐阅读
- mysql - group by 无法保留重复项
- c# - 制作一个检查用户输入是否等于随机数的方法
- php - 如何在 .htaccess 中使用正确的重定向在 PHP 中创建干净的 URL?
- android - 如何在 Google Play 游戏服务中为多人游戏传递额外参数?
- java - Java编译错误“未找到变量”持续存在
- python - 将 Jupyter Notebook 中的主题更改为深色 - 现在无法正确查看输出
- jenkins-pipeline - 如何在成员函数中使用内置管道函数?
- c# - 使用 Azure Function (.NET Core) 下载文件
- java - JPA Criteria API 中订单的自定义 SQL
- excel - 尽管条件有效,vba 执行直到循环不进入