J'étais un peu ennuyé par le manque de benchmarks pour cela en ligne, alors j'ai moi-même fait un test.
Notez cependant que je ne le fais pas régulièrement, veuillez donc vérifier ma configuration et les étapes pour tout facteur qui aurait pu influencer les résultats involontairement, et poster vos préoccupations dans les commentaires.
La configuration était la suivante:
- Processeur Intel® Core ™ i7-7500U à 2,70 GHz × 4
- 15,6 Gio de RAM, dont je me suis assuré que 8 Go environ étaient libres pendant le test.
- Disque SSD de 148,6 Go, avec beaucoup d'espace libre.
- Ubuntu 16.04 64 bits
- MySQL Ver 14.14 Distrib 5.7.20, pour Linux (x86_64)
Les tables:
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;
Ensuite, j'ai rempli 10 millions de lignes dans chaque table avec un script PHP dont l'essence est comme ceci:
$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.';
}
Pour les int
tableaux, le bit a ($keys[rand(0, 9)])
été remplacé par just rand(0, 9)
, et pour les varchar
tableaux, j'ai utilisé des noms d'états américains complets, sans les couper ou les étendre à 6 caractères. generate_random_string()
génère une chaîne aléatoire de 10 caractères.
Ensuite, j'ai couru dans MySQL:
SET SESSION query_cache_type=0;
- Pour la
jan_int
table:
SELECT count(*) FROM jan_int WHERE myindex = 5;
SELECT BENCHMARK(1000000000, (SELECT count(*) FROM jan_int WHERE myindex = 5));
- Pour les autres tableaux, comme ci-dessus, avec
myindex = 'califo'
pour les char
tableaux et myindex = 'california'
pour les varchar
tableaux.
Heures de la BENCHMARK
requête sur chaque table:
- jan_int: 21,30 s
- jan_int_index: 18,79 secondes
- jan_char: 21,70 s
- jan_char_index: 18,85 s
- jan_varchar: 21,76 s
- jan_varchar_index: 18,86 s
En ce qui concerne les tailles de table et d'index, voici la sortie de show table status from janperformancetest;
(avec quelques colonnes non affichées):
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Ma conclusion est qu'il n'y a pas de différence de performances pour ce cas d'utilisation particulier.