确定mysql中索引的状态

时间:2010-10-03 16:29:52

标签: mysql database database-indexes

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

我使用了processlist命令,该命令显示索引创建仍在使用以下输出

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

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

由于

2 个答案:

答案 0 :(得分:6)

您的索引正在构建,但速度很慢。

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

  1. 通过排序。这是最快的方法,但占用了大量内存。
  2. by keycache。慢,慢,慢 - 但耗尽了很少的记忆。
  3. keycache方法有点像插入排序:一次将值插入索引中。这与使用INSERT语句向表中添加行时服务器使用的方法相同。

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

    某些服务器变量可以增加排序方法的可用空间,因此允许它使用更大的表。请参阅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  
    

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

答案 1 :(得分:2)

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

您可以将此列标准化为另一个表吗?

如果没有,那么这些值往往会在前8个字符中充分变化?你可能只能将前8个索引编入索引。