哪个是较便宜的查询计数(id)或按ID排序

时间:2011-03-27 04:53:59

标签: mysql sql

我想知道以下哪些内容在MySQL数据库中执行得更快。该表将有200-1000个条目。

  SELECT id 
    from TABLE 
order by id desc
   limit 1

SELECT count(id) 
  from TABLE

故事是表格被缓存。因此,每次在高速缓存检索之前执行此查询,以通过比较先前的值来确定高速缓存数据是否无效。

因此,如果存在更便宜的查询,请告知我们。感谢。

3 个答案:

答案 0 :(得分:2)

如果你

  1. 从1开始
  2. 永远不会有任何差距
  3. 使用InnoDB引擎
  4. id不可为空
  5. 然后,由于不必访问表数据(计数存储在元数据中),第二个可以[更加勉强]运行。

    否则,

    • 如果表中没有ID索引(导致SCAN),则第二个更快

    同时禁止上述

    • 第一个更快

    <小时/> 如果你真的想问SELECT .. LIMIT 1 vs SELECT MAX(id)..,那么答案实际上是MySQL和大多数理智的DBMS都是一样的,无论是否有索引。

答案 1 :(得分:0)

我认为,第一个查询运行得更快,因为查询仅限于一行执行,在这种情况下200-1000可能无关紧要。

答案 2 :(得分:0)

正如评论中已经指出的那样,你的表太小了,实际上并不是你的解决方案。出于这个原因,应该使用select count(id),因为它表达了意图,不需要任何进一步的处理。

现在select count(id)附带了另一个select count(*)。这两个不是同义词。 select count(*)将计算行数,并在select count(id)计算列id的非空值数存在时使用缓存值。如果id列设置为非null,则可以使用缓存的行计数。

count(*)count(id)之间的选择再次取决于您的意图。在一般情况下,count(*)更好地描述了意图。

使用mysql时count(1)实际上可能是count(*)的同义词,但如果最终使用不同的RDBMS,解释可能会有所不同。

每种类型的计数的性能也取决于您使用的是MyISAM还是InnoDB。如果我理解正确的话,行计数会缓存在前者上,而不会缓存在后者上。

最后,您应该依赖查询计划和运行测试并测量它们的性能,而不是这些一般的ramblings。