【问题标题】:Determine status of an index in mysql确定mysql中索引的状态
【发布时间】:2010-10-03 16:29:52
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: mysql database database-indexes


    【解决方案1】:

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

    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  
    

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

    【讨论】:

    • 如果我再次开始插入数据,一切都会中断吗?
    • 如果索引构建仍在运行,MySQL 将不允许您向该表中插入更多数据。
    • 我还尝试查看临时文件是否正在扩展,但我不知道如何在盒子上使用 sudo。有其他方法的想法吗?我担心这个过程在某种程度上崩溃了,我只是在空闲时间。
    • 您可以运行“top”和“iostat”。 Top 应该显示您的 MySQL 线程之一非常繁忙,并且 iostat 应该显示大量读写磁盘。 MySQL 很可能运行良好 - 只是需要很长时间才能完成索引。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这是我根本没有考虑过的,因为我不知道如何正确设计它:) 事实上,数据可以很容易地在另一个表中归一化为更短的值。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多