【问题标题】:MySQL GROUP BY on large tablesMySQL GROUP BY 在大表上
【发布时间】:2016-07-03 01:29:41
【问题描述】:

我有一个包含超过 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 的专用 mysql 服务器 5.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`;

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

有什么帮助可以加快速度吗?

谢谢

【问题讨论】:

  • 当然。您正在对所有记录使用函数。即使是索引也不会使这更快。在其他数据库引擎上,查询会失败。为什么不聚合 URL 列以及期望的输出?
  • @juergend 一些 RDBMS(例如 Oracle)确实有功能索引,虽然 MySQL 可能没有这个。
  • @您的哈希值是 varchar (40 ),因此它将有相当长的长度,尽管您已将其编入索引,但这会影响您的性能
  • @juergen d @Tim Biegeleisen 感谢您的 cmets。我想生成一个所有网址都不同的子集(新表)。 hash 列只有 url 的 SHA-1 值。我已经将一些服务器参数更改为 innodb_buffer_pool_size = 2G innodb_log_file_size = 1G max_connections = 500 innodb_file_per_table = 1 innodb_log_buffer_size = 128M query_cache_size = 0 max_allowed_pa​​cket = 100M

标签: mysql performance innodb


【解决方案1】:

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

innodb_buffer_pool_size = 2G 对于 4GB 的 RAM 来说非常危险。如果发生交换,性能将受到严重影响。

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

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多