2015-10-07 89 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更快,即使在表增長的情況下也是如此。

相關問題