Mysql
MyISAM 比 InnoDB 慢約 5 倍
我認為,
MyISAM
由於其架構比InnoDB
. 因此,我將此表的引擎更改InnoDB
為MyISAM
: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`);
這些條件適用:
- 我正在一個 SLES 15.1 VM 上測試它,它在我的主機上具有 5 GB RAM 和 8 個 CPU 核心,它不必為其他 VM 提供服務$$ just an information that there is no other VM which may influence the result $$.
- 一個 PHP 腳本正在執行數以千計的以下 SELECT 語句。
- 數據庫中有 24 個上述表可以在 PHP 腳本中訪問。
- 每個表有約 800k 行。
- 在每次測試之間,我都會重新啟動伺服器以確保始終存在相同的條件。由於差異如此之大,我沒有執行多次測試來獲得平均值……
執行時間:
- 使用
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
版本不會提高性能。我的問題:
- 為什麼
InnoDB
不需要這些索引並且仍然更快?- 有更好的解決方案嗎?
- 而且,我顯然完全誤解了
MyISAM
導致如此可怕表現的變化。
- InnoDB 在索引方面也會更快。
2)具有適當索引的 InnoDB 是最好的解決方案。
- 十多年來,對於大多數工作負載,MyISAM 都比 InnoDB 慢。兩者之間的記憶體和記憶體工作方式存在根本差異。
在這種情況下,InnoDB 通過主鍵選擇第一行。由於 InnoDB 表是按主鍵聚集的,因此速度非常快,並且 PK 在您創建表時可能已經在記憶體中。
在 BidHigh 中創建一個索引,它會更快。
除非你有充分的理由使用 MyISAM - 你不應該。如果你認為你有一個非常好的理由,你應該重新審視它,因為它們在 2020 年將消失得無影無踪。