大型表上的MySQL GROUP BY

时间:2016-07-03 01:29:41

标签: mysql performance innodb

我有一张超过7500万个寄存器的表。我想通过运行一个小组来总结这些注册表。

表结构是:

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和4GB RAM需要这么长时间:

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`;

在表格报告中,哈希列上有一个唯一索引

有任何帮助加快速度吗?

感谢的

1 个答案:

答案 0 :(得分:1)

这里的主要成本是所有I / O.需要阅读整个表格。

对于4GB的RAM,

innodb_buffer_pool_size = 2G非常危险。如果发生交换,性能将受到严重影响。

由于hash是一个SHA1,因此在75M网址中极有可能是唯一的。这样GROUP BY将产生75M行。这可能不是你想要的。重写查询后,我们可以讨论优化。