【发布时间】:2013-04-23 17:20:44
【问题描述】:
我在 mysql 数据库中有一个表“Words”。此表包含 2 个字段。 word(VARCHAR(256)) 和 p_id(INTEGER)。 为表创建表语句:
CREATE TABLE `Words` (
`word` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`p_id` int(11) NOT NULL DEFAULT '0',
KEY `word_i` (`word`(255))
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
表中的示例条目是:
+------+------+
| word | p_id |
+------+------+
| a | 1 |
| a | 2 |
| b | 1 |
| a | 4 |
+------+------+
此表包含 30+ 百万个条目。我正在按查询运行一个组,运行该查询需要 90 多分钟。我正在运行的分组查询是:
SELECT word,group_concat(p_id) FROM Words group by word;
为了优化这个问题,我使用以下查询将表中的所有数据发送到一个文本文件中。
SELECT p_id,word FROM Words INTO OUTFILE "/tmp/word_map.txt";
之后,我编写了一个 Perl 脚本来读取文件中的所有内容并对其进行解析并从中生成哈希值。与 Group by query(
EDT:我在下面添加 my.cnf 文件条目。
[mysqld]
datadir=/media/data/.mysql_data/mysql
tmpdir=/media/data/.mysql_tmp_data
innodb_log_file_size=5M
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
group_concat_max_len=4M
max_allowed_packet=20M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
tmpdir=/media/data/.mysql_tmp_data/
谢谢,
维诺德
【问题讨论】:
-
您是否设置了 mysql 以允许如此高的内存使用?
-
(word, p_id)上的索引可能会有所帮助。 -
你真的需要这么长 (256) 个 utf8 字符吗?
-
@ypercube,是的,有 500 万多个条目的长度在 230-250 的范围内。这里的“单词”列实际上存储了一个短语。
-
500 万还是 3000 万?又有多少不同的词?
标签: mysql group-by group-concat