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中删除。
在我的服务器上,两者都足够快,但理论上这两个选项中的一个可能更快:)
答案 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 - 滚动到评论部分)
在大多数情况下,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条件