2016-08-02 1 views
0

Мы используем memsql 5.1 для проекта веб-аналитики. Существует около 80 миллионов записей и 0,5 М записей в день. Простой запрос работает около 5 секунд - сколько данных было получено за домен, geo, lang за данный день. Я чувствую, что можно сократить это время, но я не могу найти способ. Пожалуйста, скажи мне дорогу.5 секунд за выбор из записей 80M в memsql

Таблицы, как один

CREATE TABLE `domains` (
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `geo` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `lang` char(5) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `browser` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `os` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `device` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `domain` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `ref` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, 
    `blk_cnt` int(11) DEFAULT NULL, 
    KEY `date` (`date`,`geo`,`lang`,`domain`) /*!90619 USING CLUSTERED COLUMNSTORE */ 
    /*!90618 , SHARD KEY() */ 
    ) 

запроса, как этот:

memsql> explain SELECT domain, geo, lang, avg(blk_cnt) as blk_cnt, count(*) as cnt FROM domains WHERE date BETWEEN '2016-07-31 0:00' AND '2016-08-01 0:00' GROUP BY domain, geo, lang ORDER BY blk_cnt ASC limit 40; 
    +-------------------------------------------------------------------------------------------------------------------------------------------------------+ 
    | EXPLAIN                                      | 
    +-------------------------------------------------------------------------------------------------------------------------------------------------------+ 
    | Project [r0.domain, r0.geo, r0.lang, $0/CAST(COALESCE($1,0) AS SIGNED) AS blk_cnt, CAST(COALESCE($2,0) AS SIGNED) AS cnt]         | 
    | Top limit:40                                     | 
    | GatherMerge [SUM(r0.s)/CAST(COALESCE(SUM(r0.c),0) AS SIGNED)] partitions:all est_rows:40                 | 
    | Project [r0.domain, r0.geo, r0.lang, s/CAST(COALESCE(c,0) AS SIGNED) AS blk_cnt, CAST(COALESCE(cnt_1,0) AS SIGNED) AS cnt, s, c, cnt_1] est_rows:40 | 
    | TopSort limit:40 [SUM(r0.s)/CAST(COALESCE(SUM(r0.c),0) AS SIGNED)]                       | 
    | HashGroupBy [SUM(r0.s) AS s, SUM(r0.c) AS c, SUM(r0.cnt) AS cnt_1] groups:[r0.domain, r0.geo, r0.lang]              | 
    | TableScan r0 storage:list stream:no                               | 
    | Repartition [domains.domain, domains.geo, domains.lang, cnt, s, c] AS r0 shard_key:[domain, geo, lang] est_rows:40 est_select_cost:144350216   | 
    | HashGroupBy [COUNT(*) AS cnt, SUM(domains.blk_cnt) AS s, COUNT(domains.blk_cnt) AS c] groups:[domains.domain, domains.geo, domains.lang]    | 
    | Filter [domains.date >= '2016-07-31 0:00' AND domains.date <= '2016-08-01 0:00']                    | 
    | ColumnStoreScan scan_js_data.domains, KEY date (date, geo, lang, domain) USING CLUSTERED COLUMNSTORE est_table_rows:72175108 est_filtered:18043777 | 
    +-------------------------------------------------------------------------------------------------------------------------------------------------------+ 

После применения рекомендаций

  • время первоначального запроса - 5s
  • с оптимизацией временных меток - 3,7 с
  • с отметкой времени + shardkey - 2.6s

Спасибо большое!

+0

мы добавили больше VCPU и: времени первоначального запроса - 5s с оптимизацией временных меток - 3.7s с отметкой времени + shardkey - 2.6s спасибо вам матч! – Georgy

ответ

0

Выполнение группы является, вероятно, самой дорогой частью этого запроса. Использование ключа осколка, которое соответствует группе, то есть SHARD KEY (domain, geo, lang), позволит группе выполнить быстрее.

+0

также, изменив фильтры с 'date BETWEEN' 2016-07-31 0:00 'AND' 2016-08-01 0: 00'' на 'date BETWEEN timestamp ('2016-07-31 0:00') AND timestamp ('2016-08-01 0:00') 'должно улучшить ситуацию. –

Смежные вопросы