Bu çevrimiçi için kıstasların olmaması beni biraz rahatsız etti, bu yüzden kendimi bir test yaptım.
Düzenli bir temelde yapmadığımı unutmayın, bu yüzden lütfen sonuçları istemeden etkileyebilecek herhangi bir faktör için kurulumumu ve adımlarımı kontrol edin ve endişelerinizi yorumlarda yayınlayın.
Kurulum aşağıdaki gibidir:
- Intel® Core ™ i7-7500U CPU @ 2,70GHz × 4
- Test sırasında 8 GB civarında temin ettiğim 15.6 GiB RAM boştu.
- Bol miktarda boş alana sahip 148,6 GB SSD sürücü.
- Ubuntu 16.04 64 bit
- MySQL Ver 14.14 Linux için 5.7.20 Dağıtımı (x86_64)
Masalar:
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;
Sonra, özü şöyle bir PHP betiği ile her tabloda 10 milyon satır doldurdum:
$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.';
}
İçin int
masalar, biraz ($keys[rand(0, 9)])
sadece ile değiştirildi rand(0, 9)
ve için varchar
masalar, ben kesme veya 6 karakter onları uzatmadan, tam ABD devlet isimleri kullanılır. generate_random_string()
10 karakterli rastgele bir dize oluşturur.
Sonra MySQL'de koştum:
SET SESSION query_cache_type=0;
- İçin
jan_int
masanın:
SELECT count(*) FROM jan_int WHERE myindex = 5;
SELECT BENCHMARK(1000000000, (SELECT count(*) FROM jan_int WHERE myindex = 5));
- Yukarıdaki ile aynı diğer tablolar, için
myindex = 'califo'
için char
tablolar ve myindex = 'california'
için varchar
tablo.
BENCHMARK
Her bir tablodaki sorgunun saatleri :
- jan_int: 21.30 saniye
- jan_int_index: 18.79 saniye
- Jan_char: 21.70 saniye
- jan_char_index: 18.85 saniye
- jan_varchar: 21.76 saniye
- jan_varchar_index: 18.86 saniye
Tablo ve dizin boyutlarıyla ilgili olarak, çıktısı show table status from janperformancetest;
(gösterilmeyen birkaç sütunla):
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Sonuç olarak, bu özel kullanım durumu için performans farkı yoktur.