ฉันค่อนข้างรำคาญกับการขาดมาตรฐานสำหรับออนไลน์ดังนั้นฉันจึงทำการทดสอบด้วยตัวเอง
โปรดทราบว่าฉันไม่ได้ทำตามปกติดังนั้นโปรดตรวจสอบการตั้งค่าและขั้นตอนของฉันสำหรับปัจจัยที่อาจมีผลต่อผลลัพธ์โดยไม่ตั้งใจและโพสต์ข้อกังวลของคุณในความคิดเห็น
การตั้งค่ามีดังนี้:
- Intel® Core ™ i7-7500U CPU @ 2.70GHz × 4
- 15.6 GiB RAM ซึ่งฉันมั่นใจว่าประมาณ 8 GB นั้นฟรีในระหว่างการทดสอบ
- ไดรฟ์ SSD ขนาด 148.6 GB พร้อมพื้นที่ว่างมากมาย
- Ubuntu 16.04 64 บิต
- MySQL Ver 14.14 Distrib 5.7.20, สำหรับ Linux (x86_64)
โต๊ะ:
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;
จากนั้นฉันเติมเต็ม 10 ล้านแถวในแต่ละตารางด้วยสคริปต์ PHP ที่มีสาระสำคัญดังนี้:
$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.';
}
สำหรับint
ตารางบิต($keys[rand(0, 9)])
นั้นถูกแทนที่ด้วย just rand(0, 9)
และสำหรับvarchar
ตารางฉันใช้ชื่อรัฐเต็มของสหรัฐอเมริกาโดยไม่ต้องตัดหรือขยายให้เหลือ 6 อักขระgenerate_random_string()
สร้างสตริงสุ่ม 10 ตัวอักษร
จากนั้นฉันก็วิ่งใน MySQL:
SET SESSION query_cache_type=0;
- สำหรับ
jan_int
ตาราง:
SELECT count(*) FROM jan_int WHERE myindex = 5;
SELECT BENCHMARK(1000000000, (SELECT count(*) FROM jan_int WHERE myindex = 5));
- สำหรับตารางอื่น ๆ เช่นเดียวกับข้างต้นด้วย
myindex = 'califo'
สำหรับchar
ตารางและmyindex = 'california'
สำหรับvarchar
ตาราง
เวลาของBENCHMARK
แบบสอบถามในแต่ละตาราง:
- jan_int: 21.30 วินาที
- jan_int_index: 18.79 วินาที
- jan_char: 21.70 วินาที
- jan_char_index: 18.85 วินาที
- jan_varchar: 21.76 วินาที
- jan_varchar_index: 18.86 วินาที
เกี่ยวกับขนาดของตาราง & ดัชนีนี่คือผลลัพธ์ของshow table status from janperformancetest;
(ไม่กี่คอลัมน์ที่ไม่แสดง):
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
ข้อสรุปของฉันคือไม่มีประสิทธิภาพแตกต่างกันสำหรับกรณีการใช้งานเฉพาะนี้