我有一张登记册超过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;

我想执行下面的查询,但是使用一个专用的带4GB RAM的MySQLServer5.5需要很长时间:
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`;

表报表的哈希列上有唯一索引
有什么可以加快速度的吗?
谢谢

最佳答案

这里的主要成本是所有I/O。需要读取整个表。
innodb_buffer_pool_size = 2G对于4GB的RAM来说是危险的高。如果发生交换,性能将受到严重影响。
因为hash是一个SHA1,所以它很可能在仅7500万个url中是唯一的。因此GROUP BY将产生75M行。这可能不是你想要的。重写查询后,我们可以讨论优化。

关于mysql - 大表上的MySQL GROUP BY,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38165944/

10-13 09:10