5

我在一个有 3500 万条记录的表上创建了一个新索引,它已经运行了将近 1 天。以前,当我创建索引需要 20 分钟时,列却是浮动的。新的 idnex 在 varchar(45) 上

我使用了 processlist 命令,它显示索引创建仍在进行中,输出如下

65417 | Repair with keycache | CREATE INDEX insert_index on checkins(dateinserted)

我想知道是否有人可以给我建议以找出查询是否真的死了并且只是坐在进程列表中。也许在某个阶段出了点问题,我不知道。

谢谢

4

2 回答 2

7

您的索引正在建立,但非常缓慢。

MySQL 有两种方法可用于构建索引:

  1. 通过排序。这是最快的方法,但会占用大量内存。
  2. 通过密钥缓存。慢,慢,慢 - 但占用的内存很少。

keycache 方法有点像插入排序:一次将值插入索引中。这与使用 INSERT 语句向表中添加行时服务器使用的方法相同。

排序方法使用快速排序对所有值进行排序,然后从中构建索引。它非常快,但需要大量内存和临时磁盘空间。

一些服务器变量可以增加排序方法的可用空间,因此允许它处理更大的表。见 myisam_max_sort_file_size

http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_myisam_max_sort_file_size

在 Linux 上,您可以通过检查用于构建索引的临时文件的大小来跟踪索引修复的进度。以下命令将列出 MySQL 进程打开的所有文件:

sudo ls -l /proc/[mysql-pid]/fd  

然后检查名称中带有哈希的文件的大小 - 这些是临时文件。

于 2010-10-03T16:38:55.633 回答
2

请记住,索引大小至少为 35M*45。如果它是一个 utf8 列,那么它将是 35M*45*3。超过4场演出!如果您没有大量的 RAM 来支持它,那么它将不得不进行大量磁盘访问并真正降低性能。

您可以将此列规范化到另一个表中吗?

如果不是,那么前 8 个字符的值是否会发生很大变化?那时您可能只需索引前 8 个即可。

于 2010-10-03T17:50:00.823 回答