在mysql解释中更高的行数是否意味着好坏?

时间:2015-10-07 08:08:20

标签: mysql sql innodb myisam explain

我有一个旧的MyISAM表,当我提交一些计数查询时,表被锁定。如果我在相同的InnoDB表上执行相同的查询,则查询会快速执行。问题是,旧的MyISAM表仍然在生产中使用并且负载很重,而新的表不是。

现在我们来讨论我的问题和疑问。当我解释在两个表中执行的查询时,我得到的结果让我感到困惑。

以下是我在两个表中执行的查询:

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在执行一段时间后被锁定的原因。

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

编辑:旧表的列数比新表的列多两倍。由于旧的已分为2个表。

2 个答案:

答案 0 :(得分:2)

<强>黑室内男孩:

  

因此,如果较高的数字是坏的,这是否意味着一旦完全使用新表上的查询会更慢?

MySQL manual说明了EXPLAIN中的rows列:

  

rows列表示MySQL认为必须的行数   检查以执行查询。

     

对于InnoDB表,此数字是估算值,可能并非总是如此   精确。

所以,数字越高也不错,它只是基于表元数据的猜测。

<强>黑室内男孩:

  

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

数字越大越好。 MyISAM被锁定不是因为这个数字。

Manual

  

MySQL对MyISAM使用表级锁定,只允许一个会话   一次更新这些表,使它们更适合   只读,大多数读取或单用户应用程序。

     

...表更新的优先级高于表检索...   如果对表有很多更新,SELECT语句会等到   没有更新。

如果您的表经常更新,它会被INSERT,UPDATE和DELETE(a.k.a。DML)语句锁定,这会阻止您的SELECT查询。

答案 1 :(得分:1)

行计数告诉您MySQL必须检查多少行才能获得查询结果。这是索引帮助的地方,并且名为 index cardinality 的数字起着非常重要的作用。索引可以帮助MySQL减少对行的检查,因此它做得越少 - 它就越快。由于有许多行满足vrsta_dokumenta = 3 AND dostupnost = 0的条件,因此MySQL只需要经历这些行,找到它们并递增计数器。对于MyISAM来说,这意味着MySQL必须从磁盘读取数据 - 这很昂贵,因为磁盘访问速度非常慢。对于InnoDB来说,它非常快,因为InnoDB可以将其工作数据集存储在内存中。换句话说,MyISAM从磁盘读取,而InnoDB将从内存中读取。还有其他优化可用,但一般规则是InnoDB比MyISAM更快,即使表增长也是如此。