高行计数在MySQL Explain中是好还是坏?

3
我有一张旧的MyISAM表格,当我提交某些计数查询时,该表格会被锁定。如果我在同一张InnoDB表格上执行相同的查询,则可以快速完成查询。问题是,旧的MyISAM表格仍在生产环境中使用,并且承受着重负载,而新表格则没有。 现在我们来到我的问题和疑问。当我对两个表格中执行的查询进行 explain 时,我得到了一些困惑的结果。 以下是我在两个表格中执行的查询:
SELECT COUNT(*)
FROM table
WHERE vrsta_dokumenta = 3
    AND dostupnost = 0

这里是旧的MyISAM表的解释:

id select_type table     type possible_keys         key               key_len ref    rows   Extra    
1  SIMPLE     old_table  ref idx_vrsta_dokumenta idx_vrsta_dokumenta     1   const 564253  Using where 

以下是新InnoDB表的说明:

id select_type   table  type    possible_keys         key           key_len  ref    rows   Extra     
1  SIMPLE      new_table ref idx_vrsta_dokumenta idx_vrsta_dokumenta   1    const 611905 Using where

正如您所看到的,新表中的行数比旧表多。

因此,在较高数字是不好的情况下,这是否意味着在完全使用后查询新表将变慢?

如果更高的数字是好的,则可能这就是新表更快的原因,而MyISAM在执行一段时间后会被锁定。

无论如何,什么是正确的?这些行数是什么意思?

编辑:旧表有两倍于新表的列,因为旧表已经被分成两个表。


请同时提供表结构。哪些列已经建立了索引。WHERE子句中的列是否已经建立了索引? - hjpotter92
表中总共有多少行?COUNT函数会返回多少行? - user4035
@hjpotter92 - 我无法提供完整的表结构,它们对公众关闭了。WHERE子句中的第一列已建立索引,第二列未建立索引。两列都是tinyint类型的。 - black-room-boy
@user4035 - 每个表大约有120万行数据。在InnoDB中,count返回结果为:229626,在旧的MyISAM引擎下,我不知道具体数目,但查询执行时间非常长,并且会锁定表格。 - black-room-boy
2个回答

3

黑屋男孩:

那么如果更高的数字是不好的情况下,这是否意味着一旦完全使用新表进行查询,查询将变得更慢?

MySQL手册关于EXPLAIN中的行列:

行列指示MySQL认为必须检查执行查询所需的行数。

对于InnoDB表,此数字是估计的,可能并不总是准确的。

因此,更高的数字并不是坏的,它只是基于表元数据的猜测。

黑屋男孩:

如果更高的数字是好的情况下,那么也许这就是新表更快的原因,而MyISAM在执行一段时间后被锁定。

更高的数字不好。 MyISAM之所以被锁定,并不是因为这个数字。

手册

MySQL对MyISAM使用表级锁定,一次仅允许一个会话更新这些表,使其更适用于只读、读最多或单用户应用程序。

…表更新比表检索优先级更高…如果您对表进行了许多更新,SELECT语句会等到没有更多的更新。

如果您的表经常更新,则INSERT、UPDATE和DELETE(也称为DML)语句将锁定该表,这会阻止您的SELECT查询。


谢谢你的回答,是的,看起来更新阻塞了我的选择操作。我猜InnoDB会有显著的改进。 - black-room-boy

2
行数统计告诉你MySQL为获得查询结果而必须检查多少行数据。这是索引的帮助作用,也是一个叫做“索引基数”扮演重要角色的数字。索引能够帮助MySQL减少了检查行数据的工作量,因此它所需要的时间就越短。由于满足条件vrsta_dokumenta = 3 AND dostupnost = 0的行数据很多,MySQL只需遍历、找到并计数即可。对于MyISAM,这意味着MySQL必须从磁盘读取数据,因为磁盘访问非常缓慢,所以这个操作代价较高。对于InnoDB,这个操作非常迅速,因为InnoDB可以将其工作数据集存储在内存中。换句话说,MyISAM从磁盘读取数据,而InnoDB将从内存中读取数据。还有其他的优化方法,但总体规则是InnoDB会比MyISAM更快,即使表格增长。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,