2015-10-07 86 views
1

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

现在我们来谈谈我的问题和问题。当我解释在两个表中执行的查询时,我会得到一些令我困惑的结果。

这里是我两个表中正在执行查询:

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

请同时提供表格结构。哪些列已被索引。 “WHERE”子句中的列是否被索引? – hjpotter92

+0

表中共有多少行? COUNT有多少人返回? – user4035

+0

@ hjpotter92 - 我无法提供完整的表格结构,它们已关闭以供公众查看。 'WHERE'子句中的第一列被索引,其次不是。这两列都是tinyint。 –

回答

2

黑房间男孩:

所以在这个较大的数字是坏的情况下,这是否意味着在新表的查询速度会变慢,一旦它完全使用?

MySQL manual说,大约在列列说明:

rows列指出MySQL认为它必须 检查以执行查询的行数。

对于InnoDB表,这个数字是一个估计值,并不总是精确的 。

因此,较高的数字并不差,这只是基于表元数据的猜测。

黑房间男孩:

如果人数较多是好的,那么也许这就是为什么 新表是速度更快,和MyISAM得到 执行一段时间后锁定。

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

Manual

MySQL使用表级锁对MyISAM,只允许一个会话 在同一时间更新这些表,使他们更适合 只读,以读为主,或单用户应用程序。

...表格更新的优先级高于表格检索... 如果您有许多表格的更新,SELECT语句将一直等到 没有更新。

如果您的表经常更新,它得到的由INSERT,UPDATE锁定和删除(又名DML)语句,此块你的SELECT查询。

+0

谢谢你的回答,是的,似乎更新阻止了我的选择。我猜InnoDB会有很大的改进。 –

1

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

相关问题