MySQL版本8.0.32-0ubuntu0.20.04.2
我正在嘗試提高 SELECT 效能,而不是規避執行 SELECT。
CREATE TABLE big_table ( pk INT AUTO_INCREMENT PRIMARY KEY, field1 VARCHAR(255), field2 VARCHAR(255), field3 mediumtext, field4 BIGINT, KEY idx_field4 (field4) ) ENGINE=MyISAM CHARSET=utf8mb3;
插入 1500 萬行。
SELECT COUNT(pk) FROM big_table; +---------------+ | count(pk) | +---------------+ | 15911974 | +---------------+ 1 row in set (0.57 sec)
更改表格big_table ENGINE=INNODB;
#SELECT COUNT(pk) FROM big_table; +---------------+ | count(pk) | +---------------+ | 15911974 | +---------------+ 1 row in set (10.23 sec)
**設定 innodb_buffer_pool_size=8G (原為 128Mb)(重新啟動 MySQL)**
SELECT COUNT(pk) FROM big_table; +---------------+ | count(pk) | +---------------+ | 15911974 | +---------------+ 1 row in set (1 min 18.67 sec)
事實證明,在沒有 where 子句的 MyISAM 表上執行 SELECT COUNT(PK) 或 SELECT COUNT(*) 是一種非常特殊的情況,因為它不會計算每一行,因此速度非常快。 InnoDB 上的相同查詢很慢,因為它確實計算每一行。
然而,一旦 where 子句在索引欄位上發揮作用,InnoDB 的效能似乎就超過了 MyIsam。看來這是 99% 的用例...