Tôi đã có một chút khó chịu vì thiếu điểm chuẩn cho trực tuyến này, vì vậy tôi đã tự mình chạy thử.
Lưu ý rằng mặc dù tôi không làm điều đó một cách cơ bản thường xuyên, vì vậy vui lòng kiểm tra thiết lập và các bước của tôi để biết bất kỳ yếu tố nào có thể ảnh hưởng đến kết quả ngoài ý muốn và gửi những lo ngại của bạn trong các bình luận.
Các thiết lập như sau:
- CPU Intel® Core ™ i7-7500U @ 2.70GHz × 4
- RAM 15,6 GiB, trong đó tôi đảm bảo khoảng 8 GB là miễn phí trong quá trình thử nghiệm.
- Ổ SSD 148,6 GB, có nhiều dung lượng trống.
- Ubuntu 16.04 64-bit
- MySQL Ver 14,14 Phân phối 5.7.20, cho Linux (x86_64)
Những cái bàn:
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;
Sau đó, tôi đã lấp đầy 10 triệu hàng trong mỗi bảng bằng một tập lệnh PHP có bản chất là như thế này:
$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.';
}
Đối với int
các bảng, bit ($keys[rand(0, 9)])
được thay thế bằng chỉ rand(0, 9)
và đối với varchar
các bảng, tôi đã sử dụng tên trạng thái đầy đủ của Hoa Kỳ mà không cắt hoặc mở rộng chúng thành 6 ký tự. generate_random_string()
tạo ra một chuỗi ngẫu nhiên gồm 10 ký tự.
Sau đó, tôi chạy trong MySQL:
SET SESSION query_cache_type=0;
- Đối với
jan_int
bảng:
SELECT count(*) FROM jan_int WHERE myindex = 5;
SELECT BENCHMARK(1000000000, (SELECT count(*) FROM jan_int WHERE myindex = 5));
- Đối với các bảng khác, tương tự như trên, với
myindex = 'califo'
cho char
bảng và myindex = 'california'
cho varchar
bảng.
Thời gian của BENCHMARK
truy vấn trên mỗi bảng:
- jan_int: 21.30 giây
- jan_int_index: 18,79 giây
- jan_char: 21,70 giây
- jan_char_index: 18,85 giây
- tháng một: 21,76 giây
- jan_varchar_index: 18,86 giây
Về kích thước bảng và chỉ mục, đây là đầu ra của show table status from janperformancetest;
(w / một vài cột không được hiển thị):
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
Kết luận của tôi là không có sự khác biệt về hiệu năng cho trường hợp sử dụng cụ thể này.