2016-07-03 4 views
1

У меня есть таблица с более чем 75 миллионами регистров. Я хочу запустить группу, чтобы суммировать эти реестры.MySQL GROUP BY на больших таблицах

Структура таблицы:

CREATE TABLE `output_medicos_full` (
    `name` varchar(100) NOT NULL DEFAULT '', 
    `term` varchar(50) NOT NULL DEFAULT '', 
    `hash` varchar(40) NOT NULL DEFAULT '', 
    `url` varchar(2000) DEFAULT NULL, 
    PRIMARY KEY (`name`,`term`,`hash`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Я хочу, чтобы выполнить приведенную ниже запрос, но так долго, используя посвящаю сервер MySQL 5.5 с 4 Гб оперативной памяти:

INSERT INTO TABLE report 
SELECT 
    `hash` 
    ,CASE UPPER(SUBSTRING_INDEX(url, ':', 1)) 
     WHEN 'HTTP' THEN 1 
     WHEN 'HTTPS' THEN 2 
     WHEN 'FTP' THEN 3 
     WHEN 'FTPS' THEN 4 
     ELSE 0 end 
    ,url 
FROM output_medicos_full 
GROUP BY `hash`; 

В отчете таблицы есть уникальный индекс в столбце хеша

Любая помощь в ускорении его?

Thank's

+0

Конечно. Вы используете функции во всех записях. Даже индекс не сделает это быстрее. На других БД-машинах запрос будет терпеть неудачу. Почему бы вам не заполнить столбец URL и какой результат вы ожидаете? –

+0

@juergend Некоторые СУБД (например, Oracle) _do_ имеют функциональные индексы, хотя MySQL может и не иметь этого. –

+0

@ ваше значение хэша - varchar (40), поэтому он будет иметь значительную длину, и это может повлиять на вашу производительность, хотя вы проиндексировали его –

ответ

1

Основная стоимость здесь - все операции ввода-вывода. Весь стол должен быть прочитан.

innodb_buffer_pool_size = 2G является опасно высоким для 4 ГБ ОЗУ. Если произойдет обмен, производительность будет страдать.

Поскольку hash является SHA1, он, скорее всего, будет уникальным по простым 75-м URL-адресам. Так что GROUP BY даст 75M строк. Вероятно, это не то, что вы хотели. После перезаписи запроса мы можем обсудить оптимизацию.