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