Ich war ein bisschen verärgert über das Fehlen von Benchmarks für dieses Online, also habe ich selbst einen Test durchgeführt.
Beachten Sie jedoch, dass ich dies nicht regelmäßig mache. Überprüfen Sie daher mein Setup und meine Schritte auf Faktoren, die die Ergebnisse unbeabsichtigt beeinflusst haben könnten, und veröffentlichen Sie Ihre Bedenken in Kommentaren.
Das Setup war wie folgt:
- Intel® Core ™ i7-7500U CPU bei 2,70 GHz × 4
- 15,6 GiB RAM, von denen ich sicherstellte, dass ungefähr 8 GB während des Tests frei waren.
- 148,6 GB SSD-Laufwerk mit viel freiem Speicherplatz.
- Ubuntu 16.04 64-Bit
- MySQL Ver 14.14 Distrib 5.7.20 für Linux (x86_64)
Die Tische:
create table jan_int (data1 varchar(255), data2 int(10), myindex tinyint(4)) ENGINE=InnoDB;
create table jan_int_index (data1 varchar(255), data2 int(10), myindex tinyint(4), INDEX (myindex)) ENGINE=InnoDB;
create table jan_char (data1 varchar(255), data2 int(10), myindex char(6)) ENGINE=InnoDB;
create table jan_char_index (data1 varchar(255), data2 int(10), myindex char(6), INDEX (myindex)) ENGINE=InnoDB;
create table jan_varchar (data1 varchar(255), data2 int(10), myindex varchar(63)) ENGINE=InnoDB;
create table jan_varchar_index (data1 varchar(255), data2 int(10), myindex varchar(63), INDEX (myindex)) ENGINE=InnoDB;
Dann füllte ich 10 Millionen Zeilen in jeder Tabelle mit einem PHP-Skript, dessen Wesen wie folgt ist:
$pdo = get_pdo();
$keys = [ 'alabam', 'massac', 'newyor', 'newham', 'delawa', 'califo', 'nevada', 'texas_', 'florid', 'ohio__' ];
for ($k = 0; $k < 10; $k++) {
for ($j = 0; $j < 1000; $j++) {
$val = '';
for ($i = 0; $i < 1000; $i++) {
$val .= '("' . generate_random_string() . '", ' . rand (0, 10000) . ', "' . ($keys[rand(0, 9)]) . '"),';
}
$val = rtrim($val, ',');
$pdo->query('INSERT INTO jan_char VALUES ' . $val);
}
echo "\n" . ($k + 1) . ' millon(s) rows inserted.';
}
Für int
Tabellen wurde das Bit ($keys[rand(0, 9)])
durch just ersetzt rand(0, 9)
, und für varchar
Tabellen habe ich vollständige US-Statusnamen verwendet, ohne sie auf 6 Zeichen zu schneiden oder zu erweitern.generate_random_string()
generiert eine 10-stellige Zufallszeichenfolge.
Dann lief ich in MySQL:
SET SESSION query_cache_type=0;
- Für
jan_int
Tabelle:
SELECT count(*) FROM jan_int WHERE myindex = 5;
SELECT BENCHMARK(1000000000, (SELECT count(*) FROM jan_int WHERE myindex = 5));
- Für andere Tabellen wie oben, mit
myindex = 'califo'
für char
Tabellen und myindex = 'california'
für varchar
Tabellen.
Zeiten der BENCHMARK
Abfrage für jede Tabelle:
- jan_int: 21.30 sek
- jan_int_index: 18,79 Sek
- jan_char: 21,70 Sek
- jan_char_index: 18,85 Sek
- jan_varchar: 21,76 Sek
- jan_varchar_index: 18,86 Sek
In Bezug auf Tabellen- und Indexgrößen ist hier die Ausgabe von show table status from janperformancetest;
(mit einigen nicht gezeigten Spalten):
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Collation |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| jan_int | InnoDB | 10 | Dynamic | 9739094 | 43 | 422510592 | 0 | 0 | 4194304 | NULL | utf8mb4_unicode_520_ci |
| jan_int_index | InnoDB | 10 | Dynamic | 9740329 | 43 | 420413440 | 0 | 132857856 | 7340032 | NULL | utf8mb4_unicode_520_ci |
| jan_char | InnoDB | 10 | Dynamic | 9726613 | 51 | 500170752 | 0 | 0 | 5242880 | NULL | utf8mb4_unicode_520_ci |
| jan_char_index | InnoDB | 10 | Dynamic | 9719059 | 52 | 513802240 | 0 | 202342400 | 5242880 | NULL | utf8mb4_unicode_520_ci |
| jan_varchar | InnoDB | 10 | Dynamic | 9722049 | 53 | 521142272 | 0 | 0 | 7340032 | NULL | utf8mb4_unicode_520_ci |
| jan_varchar_index | InnoDB | 10 | Dynamic | 9738381 | 49 | 486539264 | 0 | 202375168 | 7340032 | NULL | utf8mb4_unicode_520_ci |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Mein Fazit ist, dass es für diesen speziellen Anwendungsfall keinen Leistungsunterschied gibt.