我有一个旧的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个表。
答案 0 :(得分:2)
<强>黑室内男孩:强>
因此,如果较高的数字是坏的,这是否意味着一旦完全使用新表上的查询会更慢?
MySQL manual说明了EXPLAIN中的rows列:
rows列表示MySQL认为必须的行数 检查以执行查询。
对于InnoDB表,此数字是估算值,可能并非总是如此 精确。
所以,数字越高也不错,它只是基于表元数据的猜测。
<强>黑室内男孩:强>
如果数字越高越好,那么也许就是这个原因 新表更快,MyISAM在一段时间后被锁定 执行。
数字越大越好。 MyISAM被锁定不是因为这个数字。
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更快,即使表增长也是如此。