So verbessern Sie die Auswahlleistung einer in InnoDB konvertierten MyISAM-Tabelle mit 15 Millionen Zeilen
P粉388945432
P粉388945432 2023-09-06 19:30:08
0
1
450

MySQL-Version 8.0.32-0ubuntu0.20.04.2

Ich versuche, die SELECT-Leistung zu verbessern und nicht die Ausführung von SELECT zu umgehen.

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;

Fügen Sie 15 Millionen Zeilen ein.

SELECT COUNT(pk) FROM big_table;
+---------------+
| count(pk)     |
+---------------+
|      15911974 |
+---------------+
1 row in set (0.57 sec)

Ändern Sie die Tabelle 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 (von 128 MB) festlegen (MySQL neu starten)**

SELECT COUNT(pk) FROM big_table;
+---------------+
| count(pk)     |
+---------------+
|      15911974 |
+---------------+
1 row in set (1 min 18.67 sec)

P粉388945432
P粉388945432

Antworte allen(1)
P粉576184933

事实证明,在没有 where 子句的 MyISAM 表上执行 SELECT COUNT(PK) 或 SELECT COUNT(*) 是一种非常特殊的情况,因为它不会计算每一行,因此速度非常快。 InnoDB 上的相同查询很慢,因为它确实计算每一行。

然而,一旦 where 子句在索引字段上发挥作用,InnoDB 的性能似乎就超过了 MyIsam。看来这是 99% 的用例......

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage