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

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

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

我想知道是否有人可以给我建议,以查明查询是否实际上已死并且只是位于进程列表中。也许在某个阶段出了什么问题,而我却没有意识到。

谢谢

有帮助吗?

解决方案

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

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  

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

其他提示

请索引大小将是至少35M * 45。如果它是一个UTF8列那么这将是35M * 45 * 3。这是在4场音乐会!如果您没有吨的RAM来支持,这将不得不做大量的磁盘访问和真的杀了性能。

您可以归此列了到另一个表?

如果不这样做的值趋向于足够变化在说前8个字符?你也许能够逃脱只是索引前8即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top