【发布时间】: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_packet = 100M
标签: mysql performance innodb