मैं इस ऑनलाइन के लिए बेंचमार्क की कमी से थोड़ा परेशान था, इसलिए मैंने खुद एक परीक्षण चलाया।
ध्यान दें कि मैं इसे नियमित रूप से नहीं करता हूं, इसलिए कृपया मेरे सेटअप और चरणों की जांच करें, जो किसी भी कारक के लिए अनपेक्षित रूप से परिणामों को प्रभावित कर सकते हैं, और टिप्पणियों में अपनी चिंताओं को पोस्ट कर सकते हैं।
सेटअप इस प्रकार था:
- Intel® Core ™ i7-7500U CPU @ 2.70GHz × 4
- 15.6 GiB RAM, जिसमें से मैंने परीक्षण के दौरान लगभग 8 GB सुनिश्चित किया था।
- 148.6 जीबी एसएसडी ड्राइव, भरपूर खाली जगह के साथ।
- उबंटू 16.04 64-बिट
- लिनक्स के लिए MySQL Ver 14.14 डिस्ट्रिब्यूट 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 स्क्रिप्ट के साथ प्रत्येक तालिका में 10 मिलियन पंक्तियों को भरा जिसका सार इस प्रकार है:
$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;
(w / कुछ कॉलम नहीं दिखाए गए) का आउटपुट है :
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
मेरा निष्कर्ष यह है कि इस विशेष उपयोग के मामले में कोई प्रदर्शन अंतर नहीं है।