大表没有自增主键列如何最大化上传到云端的查询性能

问题描述 投票:0回答:1

我有一个巨大的表用于加载到云(BigQuery)。 表的结构非常简单:

CREATE TABLE `my_huge_table` (
                                 `user_id` int(10) NOT NULL,
                                 `value_id` int(11) NOT NULL,
                                 `some_value` tinyint(2) unsigned NOT NULL DEFAULT '1',
                                 `created_at` datetime DEFAULT NULL,
                                 `updated_at` datetime DEFAULT NULL,
                                 UNIQUE KEY `user_segment_UNIQUE` (`user_id`,`value_id`),
                                 KEY `user_idx` (`user_id`),
                                 KEY `value_idx` (`value_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

该表大约有 850 000 000 (850M) 行。

我们有来自 information_schema 的信息(为人类格式化的结果值):

select TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
from information_schema.TABLES where TABLE_NAME = "my_huge_table"
"TABLE_ROWS"    "849 536 609" 
"DATA_LENGTH"   "59 544 354 816"
"INDEX_LENGTH"  "38 034 964 480"

Bigquery 允许加载小于 4Gb 的块。我确定每个块的行数并接收带有 LIMIT、OFFSET 的查询包。例如:

....
SELECT * FROM `my_huge_table` t1 limit 10000000 offset 720000000;
SELECT * FROM `my_huge_table` t1 limit 10000000 offset 730000000;
...

而且速度这么慢!而这还不是全部。 每个块的查询时间(秒)增加的数据:

M   seconds
10  32
20  35
30  38
40  40
50  44
60  45
70  49
80  51
90  53
100 57
110 59
120 63
130 65
140 66
150 71
160 73
170 75
180 77
190 80
200 83
210 87
220 88
230 90
240 94
250 94
260 99
270 100
280 109
290 118
300 107
310 113
320 115
330 118
340 121
350 124
360 127
370 130
380 130
390 135
400 139
410 140
420 144
430 144
440 146
450 148
460 149
470 151
480 155
490 160
500 164
510 164
520 165
530 170
540 169
550 173
560 178
570 183
580 185
590 186
600 206
610 380
620 388
630 399
640 411
650 426
660 453
670 491
680 504
690 779
700 795
710 901
720 922
730 956
740 936
750 972
760 1010
770 1027
780 1044
790 1047
800 980
810 998

问题:如何提高所有这些查询的速度?

mysql performance query-optimization bigdata
1个回答
0
投票

https://anvatbingbong.com/请帮助我.................

© www.soinside.com 2019 - 2024. All rights reserved.