检查mySQL中是否存在记录时的性能问题?

检查mySQL中是否存在记录时的性能问题?,mysql,Mysql,我想知道这两个检查记录是否存在的查询之间是否存在性能差异 select count(1) from table where id = 1; 或 第二种说法可能更快。但实际上,差异可以忽略不计。我认为这两个查询之间不会有太大的差异:在第二种情况下选择一个字段(它是索引的一部分),在第一种情况下计算一行。。。没什么不同 尽管如此,出于好奇,我还是在我的计算机上的数据库上对这类查询做了一个非常快速的基准测试——注意,post表中只有7行,因此可能与实际情况不太接近,但由于id上有一个PK,这意味着一

我想知道这两个检查记录是否存在的查询之间是否存在性能差异

select count(1) from table where id = 1;


第二种说法可能更快。但实际上,差异可以忽略不计。我认为这两个查询之间不会有太大的差异:在第二种情况下选择一个字段(它是索引的一部分),在第一种情况下计算一行。。。没什么不同

尽管如此,出于好奇,我还是在我的计算机上的数据库上对这类查询做了一个非常快速的基准测试——注意,post表中只有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)

所以,其实差别不大,似乎^ ^

虽然帕斯卡的简历是正确的,但他的例子是错误的

benchmark(10000000000, 'select sql_no_cache id from post where id = 1')
上面的语句使用一条语句计算字符串,而不是SELECT语句本身。函数的正确语法为:

benchmark(10000000000, (select sql_no_cache id from post where id = 1))
另外,至少在MySQL 5.5.22中,在提供给基准测试的语句中使用SQL\u NO\u缓存会导致错误:

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个记录表和查询缓存关闭的实验证实,计数的工作速度只比检索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)
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)