Mysql

MyISAM 比 InnoDB 慢約 5 倍

  • May 21, 2020

我認為,MyISAM由於其架構比InnoDB. 因此,我將此表的引擎更改InnoDBMyISAM

CREATE TABLE `table1` (
 `DateTime` datetime NOT NULL,
 `BidHigh` decimal(11,5) NOT NULL,
 `BidLow` decimal(11,5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin COMMENT='1 minute rates';

ALTER TABLE `table1` ADD PRIMARY KEY (`DateTime`);

這些條件適用:

  1. 我正在一個 SLES 15.1 VM 上測試它,它在我的主機上具有 5 GB RAM 和 8 個 CPU 核心,它不必為其他 VM 提供服務$$ just an information that there is no other VM which may influence the result $$.
  2. 一個 PHP 腳本正在執行數以千計的以下 SELECT 語句。
  3. 數據庫中有 24 個上述表可以在 PHP 腳本中訪問。
  4. 每個表有約 800k 行。
  5. 在每次測試之間,我都會重新啟動伺服器以確保始終存在相同的條件。由於差異如此之大,我沒有執行多次測試來獲得平均值……

執行時間:

  • 使用InnoDB引擎,腳本執行 199 秒。
  • 使用MyISAM引擎,腳本執行 1'026 秒。長5倍以上。

我正在執行這些 SELECT 語句:

SELECT `DateTime` FROM table1
    WHERE `DateTime` BETWEEN '2018-12-27 07:50:00' AND '2199-12-31 23:59:00'
       AND BidHigh > 0.96604
    ORDER BY `DateTime` LIMIT 1;
  • 和 -
SELECT MIN( BidLow ) FROM table1
   WHERE `DateTime` BETWEEN '2018-12-27 07:45:00' AND '2199-12-31 23:59:00';

好的,我發現這是一個索引問題。添加這兩個索引

ALTER TABLE `table1` ADD UNIQUE `BidHigh` (`DateTime`, `BidHigh`);
  • 和 -
ALTER TABLE `table1` ADD UNIQUE `BidLow` (`DateTime`, `BidLow`);

修復了性能問題,現在腳本需要 245 秒,仍然慢於InnoDB- 這不是我所期望的……

將這些索引添加到InnoDB版本不會提高性能。


我的問題:

  1. 為什麼InnoDB不需要這些索引並且仍然更快?
  2. 有更好的解決方案嗎?
  3. 而且,我顯然完全誤解了MyISAM導致如此可怕表現的變化。
  1. InnoDB 在索引方面也會更快。

2)具有適當索引的 InnoDB 是最好的解決方案。

  1. 十多年來,對於大多數工作負載,MyISAM 都比 InnoDB 慢。兩者之間的記憶體和記憶體工作方式存在根本差異。

在這種情況下,InnoDB 通過主鍵選擇第一行。由於 InnoDB 表是按主鍵聚集的,因此速度非常快,並且 PK 在您創建表時可能已經在記憶體中。

在 BidHigh 中創建一個索引,它會更快。

除非你有充分的理由使用 MyISAM - 你不應該。如果你認為你有一個非常好的理由,你應該重新審視它,因為它們在 2020 年將消失得無影無踪。

引用自:https://dba.stackexchange.com/questions/267540