哪个更快:SELECT DISTINCT或WHERE foo!= 0?

时间:2015-11-16 15:17:30

标签: mysql distinct-values

id | foo | bar
--------------
0  | 0   | ...
1  | 1   | ...
2  | 2   | ...
3  | 0   | ...
4  | 2   | ...

我需要所有独特的foo值,但不是" 0"这经常是。

哪个更快?

SELECT foo FROM `table` WHERE foo != 0

SELECT DISTINCT foo FROM `table`

最后一个会保留0,但会在PHP中删除。

在我的服务器上,两者都足够快,但理论上这两个选项中的一个可能更快:)

4 个答案:

答案 0 :(得分:0)

根据所讨论的条件,distinct将是昂贵的,因为它在对主内存中提取的块中的所有记录进行排序,然后在select where时消除重复记录condition只会迭代块中的每个记录一次以过滤掉记录。

最着名的排序算法在O(nlogn)中进行,而迭代记录检查发生在O(n)时间。

因此,第一次查询更快此处

希望,它能回答你的问题。

答案 1 :(得分:0)

在大多数情况下,SELECT foo FROM table WHERE foo != 0 更快。

但在你的情况下,可以更快:

SELECT foo FROM `table` WHERE foo > 0

根据您显示的数据,您没有负值,因此您无需检查任何数据。 (如指出here - MySQL docs - 滚动到评论部分)

来自MySQL Distinct docs

  

在大多数情况下,DISTINCT子句可以视为GROUP BY

的特例

因此,如果性能存在问题,并且您

答案 2 :(得分:0)

这是一个130,000行的索引数据集。稀疏列的值范围为0-100000。密集列的值在0-100范围内。

SELECT * FROM my_table;
+----+--------+-------+
| id | sparse | dense |
+----+--------+-------+
|  1 |      0 |     0 |
|  2 |  52863 |    87 |
|  3 |  76503 |    21 |
|  4 |  77783 |    25 |
|  6 |  89359 |    73 |
|  7 |  97772 |    69 |
|  8 |  53429 |    59 |
|  9 |  35206 |    99 |
| 13 |  88062 |    44 |
| 14 |  56312 |    49 |
...

SELECT * FROM my_table WHERE sparse <> 0;
130941 rows in set (0.09 sec)

SELECT * FROM my_table WHERE dense <> 0;
130289 rows in set (0.09 sec)

SELECT DISTINCT sparse FROM my_table;
72844 rows in set (0.27 sec)

SELECT DISTINCT dense FROM my_table;
101 rows in set (0.00 sec)

如您所见,DISTINCT是否更快取决于数据的密度。

显然,在这种情况下,两个查询彼此非常不同!

答案 3 :(得分:-1)

SELECT DISTINCT foo FROM `table`

因为没有Where条件