首頁  >  問答  >  主體

如何提高轉換為 InnoDB 的 1500 萬行 MyISAM 表的選擇效能

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)

P粉388945432P粉388945432410 天前425

全部回覆(1)我來回復

  • P粉576184933

    P粉5761849332023-09-07 10:55:40

    事實證明,在沒有 where 子句的 MyISAM 表上執行 SELECT COUNT(PK) 或 SELECT COUNT(*) 是一種非常特殊的情況,因為它不會計算每一行,因此速度非常快。 InnoDB 上的相同查詢很慢,因為它確實計算每一行。

    然而,一旦 where 子句在索引欄位上發揮作用,InnoDB 的效能似乎就超過了 MyIsam。看來這是 99% 的用例...

    回覆
    0
  • 取消回覆