Estaba un poco molesto por la falta de puntos de referencia para esto en línea, así que realicé una prueba yo mismo.
Sin embargo, tenga en cuenta que no lo hago de forma regular, así que compruebe mi configuración y mis pasos para ver si hay factores que puedan haber influido en los resultados involuntariamente y publique sus inquietudes en los comentarios.
La configuración fue la siguiente:
- CPU Intel® Core ™ i7-7500U @ 2.70GHz × 4
- 15.6 GiB RAM, de los cuales me aseguré de que alrededor de 8 GB estuvieran libres durante la prueba.
- Unidad SSD de 148,6 GB, con mucho espacio libre.
- Ubuntu 16.04 de 64 bits
- MySQL Ver 14.14 Distrib 5.7.20, para Linux (x86_64)
Las mesas:
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;
Luego, llené 10 millones de filas en cada tabla con un script PHP cuya esencia es así:
$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.';
}
Para las int
tablas, el bit ($keys[rand(0, 9)])
se reemplazó con just rand(0, 9)
, y para las varchar
tablas, utilicé nombres completos de estados de EE. UU., Sin cortarlos ni extenderlos a 6 caracteres. generate_random_string()
genera una cadena aleatoria de 10 caracteres.
Luego corrí en MySQL:
SET SESSION query_cache_type=0;
- Para la
jan_int
mesa:
SELECT count(*) FROM jan_int WHERE myindex = 5;
SELECT BENCHMARK(1000000000, (SELECT count(*) FROM jan_int WHERE myindex = 5));
- Para otras tablas, igual que el anterior, con
myindex = 'califo'
para char
tablas y myindex = 'california'
para varchar
tablas.
Tiempos de la BENCHMARK
consulta en cada tabla:
- ene_int: 21.30 sec
- jan_int_index: 18.79 segundos
- jan_char: 21,70 segundos
- jan_char_index: 18.85 segundos
- jan_varchar: 21,76 segundos
- jan_varchar_index: 18.86 sec
En cuanto a los tamaños de tabla e índice, aquí está el resultado de show table status from janperformancetest;
(con algunas columnas no mostradas):
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Mi conclusión es que no hay diferencia de rendimiento para este caso de uso en particular.