我想知道这两个查询之间是否存在性能差异,用于检查记录是否存在?检查mySQL中是否存在记录时的性能问题?
select count(1) from table where id = 1;
或
select id from table where id = 1;
我想知道这两个查询之间是否存在性能差异,用于检查记录是否存在?检查mySQL中是否存在记录时的性能问题?
select count(1) from table where id = 1;
或
select id from table where id = 1;
我不认为这两个查询之间会有太大的区别:区别在于选择一个字段(这是索引的一部分)在第二种情况下,并在第一行计算一行......没有太大区别。
不过,出于好奇,我在我的电脑上的数据库上做了一个非常快速的基准查询。- 请注意,帖子表中只有7行,所以可能不是这样接近真实情况,但是因为id
上有一个PK,这意味着一个索引...。
这里就是我的了:
mysql> select benchmark(10000000000, 'select sql_no_cache id from post where id = 1');
+-------------------------------------------------------------------------+
| benchmark(10000000000, 'select sql_no_cache id from post where id = 1') |
+-------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------+
1 row in set (1 min 0,25 sec)
mysql> select benchmark(10000000000, 'select sql_no_cache count(1) from post where id = 1');
+-------------------------------------------------------------------------------+
| benchmark(10000000000, 'select sql_no_cache count(1) from post where id = 1') |
+-------------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------------+
1 row in set (1 min 0,23 sec)
所以,真的没有太大的差别,似乎^^
第二条语句是可能更快。但出于实际的目的,差异将可以忽略
虽然Pascal是正确的在他的简历,他的例子是错误的。
benchmark(10000000000, 'select sql_no_cache id from post where id = 1')
上述语句对字符串声明,而不是在SELECT语句本身。为BENCHMARK功能的正确语法是:
benchmark(10000000000, (select sql_no_cache id from post where id = 1))
此外,至少在MySQL 5.5.22,在一个错误提供的基准测试结果的声明使用SQL_NO_CACHE:
mysql> SELECT BENCHMARK(1000000000,(SELECT SQL_NO_CACHE COUNT(1) FROM players WHERE id=1));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COUNT(1) FROM players WHERE id=1))' at line 1
mysql> SELECT BENCHMARK(1000000000,(SELECT SQL_NO_CACHE id FROM players WHERE id=1));
ERROR 1054 (42S22): Unknown column 'SQL_NO_CACHE' in 'field list'
然而,使用实际语句,40000记录表和查询缓存关闭的实验证实COUNT的工作速度比检索ID快一点,即使差异可能被忽略。
mysql> set query_cache_type=0;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT SQL_NO_CACHE benchmark(1000000000,(SELECT id FROM test WHERE id=1));
+-----------------------------------------------------------+
| benchmark(1000000000,(SELECT id FROM players WHERE id=1)) |
+-----------------------------------------------------------+
| 0 |
+-----------------------------------------------------------+
1 row in set (23.17 sec)
mysql> SELECT SQL_NO_CACHE benchmark(1000000000,(SELECT COUNT(1) FROM test WHERE id=1));
+-----------------------------------------------------------------+
| benchmark(1000000000,(SELECT COUNT(1) FROM players WHERE id=1)) |
+-----------------------------------------------------------------+
| 0 |
+-----------------------------------------------------------------+
1 row in set (22.50 sec)