PostgreSQL和MySQL的效能對比實驗
測試資料庫schema:
drop table if exists t1;
drop table if exists t2;
drop table if exists t3;
create table t1(id int primary key, value1 int, value2 varchar(200));
create index s1 on t1(value1);
create table t2(id int primary key, value1 int, value2 varchar(200));
create index s2 on t2(value1);
create table t3(id int primary key, value1 int, value2 varchar(200));
create index s3 on t3(value1);
t1:1000萬行;t2:1億行;t3:3億行。
id是連續的;value1為0 - 1000000000之間的隨機值;value2為平均長度為100,最大長度為200的字串。
PG和MySQL的配置請看:
測試負載:
1. 單表上的不同型別讀負載
單點(主鍵)隨機讀負載
主鍵範圍讀負載
非主鍵的讀(二級索引讀)負載
2. 短事務
單行更新操作(insert、delete、replace、update)
QPS:每秒查詢數
QRS:查詢響應時間(單位為ms)
TPS:每秒事務數
TRS:事務響應時間(單位為ms)
統計表中第二欄的響應時間與第一欄的每秒運算元按順序一一對應
實驗一
實驗目的:測試MySQL和PG針對主鍵隨機讀負載的最優吞吐量。
測試負載:select value1 from table where id = ?,以預編譯的形式執行,id是在主鍵範圍上均勻分佈。
MySQL:
資料表t1:
執行緒數 |
QPS |
QRS |
10 |
35522, 36419 |
0.285, 0.279 |
20 |
64540, 64716 |
0.314, 0.313 |
50 |
107399, 105946 |
0.473, 0.480 |
100 |
109425, 110050 |
0.922, 0.917 |
150 |
109569, 111209 |
1.381, 1.361 |
200 |
115449, 115601 |
1.747, 1.744 |
250 |
116336, 116004 |
2.167, 2.173 |
300 |
115520, 115265 |
2.626, 2.629 |
資料表t2:
執行緒數 |
QPS |
QRS |
10 |
2679, 35821 |
3.735, 0.282 |
20 |
22583, 63940 |
0.889, 0.316 |
50 |
81851, 107456 |
0.619, 0.474 |
100 |
94480, 109425 |
1.068, 0.921 |
150 |
108686, 109180 |
1.390, 1.387 |
200 |
116322, 115101 |
1.733, 1.751 |
250 |
116211, 114987 |
2.168, 2.190 |
300 |
115134, 114702 |
2.630, 2.643 |
資料表t3:
執行緒數 |
QPS |
QRS |
10 |
1110, 30518 |
8.989, 0.331 |
20 |
3717, 52904 |
5.369, 0.384 |
50 |
18882, 75080 |
2.655, 0.675 |
100 |
42844, 87145 |
2.342, 1.156 |
150 |
98669, 91366 |
1.530, 1.654 |
200 |
61733, 88915 |
3.247, 2.259 |
250 |
67503, 85314 |
3.712, 2.942 |
300 |
88601, 84400 |
3.407, 3.570 |
PG:
資料表t1:
執行緒數 |
QPS |
QRS |
10 |
37879, 38148, 12728, 38237 |
0.275, 0.266, 0.790, 0.265 |
20 |
75037, 68906, 78759, 77142 |
0.273, 0.294, 0.261, 0.265 |
50 |
139676, 135779, 137780, 135497 |
0.366, 0.375, 0.371, 0.377 |
100 |
181549, 185476, 175890, 173170 |
0.560, 0.548, 0.580, 0.588 |
150 |
222857, 219711, 230571, 204284 |
0.695, 0.698, 0.670, 0.751 |
200 |
245709, 231214, 245812, 240065 |
0.834, 0.878, 0.836, 0.851 |
250 |
246533, 228139, 248405, 238104 |
1.044, 1.115, 1.041, 1.075 |
300 |
246229, 237196, 239975, 226885 |
1.259, 1.302, 1.294, 1.357 |
資料表t2:
執行緒數 |
QPS |
QRS |
10 |
30784, 37991, 917, 35821 |
0.329, 0.274, 10.867, 0.282 |
20 |
54830, 70700, 7591, 72989 |
0.370, 0.287, 2.636, 0.280 |
50 |
122400, 136795, 91058, 137434 |
0.417, 0.374, 0.558, 0.372 |
100 |
131690, 180934, 132992, 179460 |
0.768, 0.563, 0.780, 0.567 |
150 |
152968, 206199, 196900, 217128 |
0.993, 0.743, 0.776, 0.706 |
200 |
182414, 221721, 221870, 221576 |
1.112, 0.924, 0.921, 0.921 |
250 |
212466, 225449, 221794, 215628 |
1.210, 1.142, 1.154, 1.184 |
300 |
168306, 212136, 211857, 206145 |
1.813, 1.455, 1.456, 1.491 |
資料表t3:
執行緒數 |
QPS |
QRS |
10 |
330, 1958, 961, 5021 |
29.612, 5.097, 10.348, 1.993 |
20 |
1728, 4049, 4533, 31004 |
11.522, 4.935, 4.406, 0.649 |
50 |
3158, 6568, 7593, 83657 |
15.717, 7.596, 6.574, 0.606 |
100 |
3520, 25436, 9688, 108118 |
27.875, 3.933, 10.279, 0.934 |
150 |
3600, 23254, 10862, 121425 |
40.687, 6.445, 13.718, 1.247 |
200 |
3497, 70062, 14395, 124518 |
55.519, 2.862, 13.801, 1.618 |
250 |
3500, 121358, 10639, 27538 |
69.554, 2.096, 23.299, 9.050 |
300 |
3321, 19276, 6610, 99964 |
84.137, 15.477, 44.068, 3.024 |
實驗二
實驗目的:測試MySQL和PG針對主鍵範圍讀負載的最優吞吐量。
測試負載:select value1 from table where id between ? and ?,以預編譯的形式執行,第一個id在主鍵範圍上均勻分佈,range大小為0- 100的一個隨機值。
MySQL:
資料表t1:
執行緒數 |
QPS |
QRS |
10 |
22452, 25006 |
0.449, 0.403 |
20 |
43140, 43006 |
0.468, 0.472 |
50 |
70608, 70080 |
0.715, 0.721 |
100 |
94768, 95183 |
1.063, 1.059 |
150 |
97737, 97151 |
1.545, 1.555 |
200 |
97927, 98472 |
2.050, 2.040 |
250 |
98619, 99345 |
2.547, 2.530 |
300 |
100064, 99955 |
3.017, 3.021 |
資料表t2:
執行緒數 |
QPS |
QRS |
10 |
2570, 24857 |
3.884, 0.405 |
20 |
29401, 42460 |
0.684, 0.477 |
50 |
61110, 70015 |
0.827, 0.720 |
100 |
94516, 94408 |
1.067, 1.068 |
150 |
96446, 96910 |
1.567, 1.561 |
200 |
97494, 97542 |
2.061, 2.060 |
250 |
97760, 97704 |
2.570, 2.571 |
300 |
98889, 98637 |
3.054, 3.062 |
資料表t3:
執行緒數 |
QPS |
QRS |
10 |
9572, 21742 |
1.047, 0.463 |
20 |
20050, 33051 |
1.001, 0.610 |
50 |
21181, 36658 |
2.364, 1.370 |
100 |
27500, 30698 |
3.639, 3.260 |
150 |
29248, 31415 |
5.138, 4.777 |
200 |
28920, 31580 |
6.901, 6.331 |
250 |
28576, 31648 |
8.737, 7.899 |
300 |
28379, 28405 |
10.547, 10.535 |
PG:
資料表t1:
執行緒數 |
QPS |
QRS |
10 |
9186, 16412 |
1.091, 0.613 |
20 |
25985, 25271 |
0.775, 0.797 |
50 |
46036, 46076 |
1.094, 1.095 |
100 |
53837, 53283 |
1.868, 1.886 |
150 |
58129, 58131 |
2.594, 2.593 |
200 |
57260, 57216 |
3.501, 3.504 |
250 |
56566, 57160 |
4.431, 4.386 |
300 |
55157, 55696 |
5.458, 5.404 |
資料表t2:
執行緒數 |
QPS |
QRS |
10 |
669, 23234 |
14.835, 0.436 |
20 |
1546, 38537 |
12.839, 0.523 |
50 |
60498, 77893 |
0.835, 0.650 |
100 |
80612, 94784 |
1.255, 1.068 |
150 |
93270, 93079 |
1.622, 1.625 |
200 |
89407, 89216 |
2.250, 2.255 |
250 |
81304, 79588 |
3.092, 3.157 |
300 |
75970, 64522 |
3.969, 4.672 |
資料表t3:
執行緒數 |
QPS |
QRS |
10 |
478, 22644 |
20.777, 0.444 |
20 |
6711, 36593 |
2.981, 0.550 |
50 |
6810, 57875 |
7.325, 0.871 |
100 |
11043, 61672 |
9.021, 1.630 |
150 |
64012, 62183 |
2.354, 2.423 |
200 |
56233, 55116 |
3.561, 3.634 |
250 |
49752, 50874 |
5.033, 4.923 |
300 |
46629, 46937 |
6.442, 6.402 |
實驗三
實驗目的:測試MySQL和PG針對非主鍵隨機讀(二級索引讀)負載的最優吞吐量。
測試負載:select * from table where value1 = ?,以預編譯的形式執行,value1為0- 1000000000之間的隨機值。
MySQL:
資料表t1:
執行緒數 |
QPS |
QRS |
10 |
29816, 31100 |
0.340, 0.325 |
20 |
54376, 55684 |
0.372, 0.362 |
50 |
84479, 87363 |
0.600, 0.577 |
100 |
91269, 93196 |
1.117, 1.104 |
150 |
93550, 92525 |
1.631, 1.649 |
200 |
95492, 93564 |
2.124, 2.170 |
250 |
92432, 92742 |
2.738, 2.729 |
300 |
91378, 91544 |
3.314, 3.307 |
資料表t2:
執行緒數 |
QPS |
QRS |
10 |
12599, 31100 |
0.797, 0.325 |
20 |
29404, 53556 |
0.688, 0.377 |
50 |
54002, 78978 |
0.930, 0.637 |
100 |
63735, 71337 |
1.601, 1.436 |
150 |
63476, 84751 |
2.394, 1.801 |
200 |
94778, 94339 |
2.140, 2.151 |
250 |
92824, 90551 |
2.727, 2.793 |
300 |
91093, 87221 |
3.325, 3.473 |
資料表t3:
執行緒數 |
QPS |
QRS |
10 |
5766, 29885 |
1.735, 0.338 |
20 |
47508, 52086 |
0.425, 0.386 |
50 |
78072, 81274 |
0.644, 0.619 |
100 |
117900, 104350 |
0.879, 0.991 |
150 |
119688, 99406 |
1.293, 1.547 |
200 |
116280, 99048 |
1.749, 2.050 |
250 |
111753, 101421 |
2.272, 2.500 |
300 |
101104, 103070 |
3.001, 2.944 |
PG:
資料表t1:
執行緒數 |
QPS |
QRS |
10 |
34602, 42245, 26062, 38628 |
0.292, 0.242, 0.390, 0.269 |
20 |
65380, 75027, 63108, 62195 |
0.309, 0.271, 0.321, 0.329 |
50 |
133498, 145874, 127170, 86124 |
0.379, 0.347, 0.398, 0.586 |
100 |
198000, 200500, 199750, 115637 |
0.535, 0.527, 0.532, 0.897 |
150 |
224123, 212524, 222461, 153878 |
0.710, 0.743, 0.709, 1.006 |
200 |
270601, 276565, 270500, 168952 |
0.784, 0.768, 0.782, 1.219 |
250 |
278647, 287017, 278250, 197342 |
0.944, 0.924, 0.948, 1.304 |
300 |
269562, 283278, 271995, 277041 |
1.160, 1.123, 1.149, 1.140 |
資料表t2:
執行緒數 |
QPS |
QRS |
10 |
3048, 33721, 3097, 30111 |
3.280, 0.301, 3.227, 0.336 |
20 |
11063, 66795, 11013, 55440 |
1.810, 0.305, 1.817, 0.365 |
50 |
27153, 123778, 26733, 110513 |
1.843, 0.409, 1.872, 0.457 |
100 |
60388, 181340, 72942, 174132 |
1.685, 0.582, 1.403, 0.602 |
150 |
83470, 233631, 110977, 226715 |
1.827, 0.675, 1.383, 0.698 |
200 |
112169, 234799, 146271, 224762 |
1.816, 0.888, 1.404, 0.926 |
250 |
169017, 229063, 183515, 224988 |
1.517, 1.132, 1.402, 1.152 |
300 |
213542, 219782, 149234, 216786 |
1.445, 1.405, 2.051, 1.425 |
資料表t3:
執行緒數 |
QPS |
QRS |
10 |
1525, 16151, 2684, 10321 |
6.544, 0.623, 3.722, 0.970 |
20 |
12672, 30203, 7691, 19471 |
1.581, 0.667, 2.600, 1.031 |
50 |
23476, 70133, 14906, 53962 |
2.134, 0.717, 3.351, 0.930 |
100 |
50900, 134443, 16844, 114204 |
1.993, 0.770, 5.948, 0.906 |
150 |
63731, 137467, 20654, 153763 |
2.389, 1.122, 7.262, 1.008 |
200 |
41965, 100772, 28681, 153861 |
4.799, 2.022, 6.994, 1.334 |
250 |
31493, 69308, 22689, 88058 |
7.951, 3.651, 11.010, 2.882 |
300 |
26825, 42008, 16551, 50553 |
11.169, 7.168, 18.027, 5.962 |
實驗四
實驗目的:測試MySQL和PG針對單行更新insert負載的效能。
測試負載:insert into table values (?, ?, ?),以預編譯的形式執行,分別向資料表t1-t3最大主鍵後面亂序插入資料。
MySQL:
資料表t1:
執行緒數 |
TPS |
TRS |
10 |
9780, 9054 |
1.026, 1.108 |
20 |
10540, 15020 |
1.901, 1.338 |
50 |
13746, 19291 |
3.647, 2.622 |
100 |
19248, 19988 |
5.260, 5.040 |
150 |
15215, 18666 |
8.201, 8.053 |
200 |
16616, 16911 |
12.056, 11.873 |
250 |
16811, 16780 |
14.847, 14.873 |
300 |
16387, 17461 |
18.159, 17.168 |
資料表t2:
執行緒數 |
TPS |
TRS |
10 |
9027, 2933 |
1.112, 3.413 |
20 |
3187, 3627 |
6.262, 5.511 |
50 |
3626, 3662 |
13.674, 13.587 |
100 |
3665, 3689 |
27.047, 26.997 |
150 |
3451, 3600 |
42.603, 41.347 |
200 |
3400, 3402 |
57.620, 57.149 |
250 |
2657, 2587 |
90.501, 90.802 |
300 |
2700, 2769 |
103.547, 100.720 |
資料表t3:
執行緒數 |
TPS |
TRS |
10 |
1860, 780 |
5.431, 12.876 |
20 |
985, 1840 |
20.381, 10.948 |
50 |
650, 1747 |
73.945, 28.967 |
100 |
801, 1608 |
117.895, 60.001 |
150 |
795, 1688 |
166.787, 85.463 |
200 |
993, 1090 |
196.999, 167.334 |
250 |
1250, 1251 |
186.354, 182.215 |
300 |
1294, 1287 |
202.240, 204.294 |
PG:
資料表t1:
執行緒數 |
TPS |
TRS |
10 |
22322, 29616 |
0.453, 0.341 |
20 |
25984, 25011 |
0.780, 0.810 |
50 |
32649, 32544 |
1.555, 1.563 |
100 |
38058, 37790 |
2.671, 2.689 |
150 |
36300, 38201 |
4.188, 3.977 |
200 |
35039, 39091 |
5.813, 5.210 |
250 |
38826, 39566 |
6.564, 6.442 |
300 |
39369, 38639 |
7.716, 7.863 |
資料表t2:
執行緒數 |
TPS |
TRS |
10 |
1780, 17547 |
5.606, 0.581 |
20 |
4816, 27066 |
4.157, 0.754 |
50 |
10588, 10246 |
4.736, 4.907 |
100 |
6615, 34539 |
15.045, 2.943 |
150 |
17732, 36897 |
8.488, 4.114 |
200 |
9066, 13647 |
21.873, 14.652 |
250 |
37037, 35813 |
6.870, 7.092 |
300 |
13841, 37389 |
21.585, 8.106 |
資料表t3:
執行緒數 |
TPS |
TRS |
10 |
1467, 181 |
6.853, 53.855 |
20 |
2042, 655 |
9.902, 30.181 |
50 |
1424, 2185 |
34.748, 22.945 |
100 |
582, 4969 |
158.765, 20.586 |
150 |
1050, 4388 |
132.584, 34.757 |
200 |
2263, 3313 |
86.446, 59.566 |
250 |
2067, 2551 |
117.791, 97.917 |
300 |
2628, 1604 |
110.286, 178.498 |
實驗五
實驗目的:測試MySQL和PG針對單行更新delete負載的效能。
測試負載:delete from table where id = ?,以預編譯的形式執行,亂序地將實驗四插入的資料刪掉。
MySQL:
資料表t1:
執行緒數 |
TPS |
TRS |
10 |
7540, 9054, 8738, 8928 |
1.328, 1.108, 1.146, 1.123 |
20 |
10165, 12498, 12300, 12308 |
1.980, 1.609, 1.636, 1.632 |
50 |
14906, 14700, 15040, 14842 |
3.380, 3.425, 3.346, 3.389 |
100 |
15173, 15399, 15596, 15698 |
6.630, 6.511, 6.447, 6.409 |
150 |
15215, 15085, 15460, 15408 |
9.910, 9.978, 9.752, 9.770 |
200 |
14698, 14913, 15197, 15080 |
13.639, 13.393, 13.128, 13.265 |
250 |
14631, 14323, 14640, 14425 |
16.991, 17.364, 16.962, 17.178 |
300 |
14086, 13971, 14215, 13908 |
21.209, 21.379, 21.056, 21.439 |
資料表t2:
執行緒數 |
TPS |
TRS |
10 |
4458, 2585, 2568, 2589 |
2.244, 3.867, 3.892, 3.862 |
20 |
2596, 2647, 2614, 2638 |
|