이 온라인에 대한 벤치 마크가 부족하여 약간 화가 났으므로 테스트를 직접 실행했습니다.
정기적 인 기본 작업은하지 않으므로 의도하지 않은 결과에 영향을 줄 수있는 요인에 대한 설정 및 단계를 확인하고 우려 사항을 의견에 게시하십시오.
설정은 다음과 같습니다.
- 인텔 ® 코어 ™ i7-7500U CPU @ 2.70GHz × 4
- 15.6 GiB RAM으로 테스트 중에 약 8GB의 여유 공간이 확보되었습니다.
- 충분한 여유 공간이있는 148.6GB SSD 드라이브.
- 우분투 16.04 64 비트
- Linux 용 MySQL Ver 14.14 Distrib 5.7.20 (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;
그런 다음 각 테이블의 천만 행을 본질이 다음과 같은 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)])
단지로 대체 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 |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
필자의 결론은이 특정 사용 사례에서 성능 차이가 없다는 것입니다.