【问题标题】:How long should it take to build a single column index in MySQL for a 100K row table?在 MySQL 中为 100K 行表构建单列索引需要多长时间?
【发布时间】:2014-10-08 16:06:49
【问题描述】:

我一直在尝试在具有 100K 行的 varchar(20) 列上创建索引,到目前为止它已经运行了 30 分钟。在具有 16GB 内存和 SSD 驱动器的 8 核 i7 处理器上,我只是不明白为什么要花这么长时间。

有什么想法吗?我对 MySQL 有点陌生,但这只是一个相对较小的表上的基本 vanilla 索引。同一张表上的另一个索引只用了几秒钟就生成了。

如何在 MySQL 中调试这种东西?

【问题讨论】:

  • 什么样的索引,'唯一'?数据的可变性如何?如果不是唯一索引并且许多值相同,则可能需要一段时间。实际上,如果索引不是很有选择性,那么它可能不值得拥有。其他要检查的事项:磁盘和可用空间的碎片程度。
  • 正常的非唯一索引,但很少有重复。磁盘是新格式化的,因为这是在盒子上安装的新 LAMP。
  • 互联网搜索:'mysql 索引创建需要很长时间'返回一些有趣的链接。例如:adding an index is very slow...
  • 我做到了,但这些人都在谈论百万行。我的 100K 行表应该在几分钟内完成。现在已经快一个小时了,还在运行......

标签: mysql ddl


【解决方案1】:

表在内存中的总大小是多少?如果它足够大以至于您收到很多硬盘驱动器调用,它仍然可能需要一段时间。另外,在您执行此操作时,您的网站是否还在运行?

就调试而言,您可以检查系统上的 SQL 进程以查看它正在使用多少资源。

最后,您是否考虑过创建一个多列索引而不是两个单列索引?

【讨论】:

  • 数据长度为22609920。小。 ...并且盒子正在运行全新的 LAMP 安装。机箱上的 CPU 为 10%。
【解决方案2】:

事实证明,默认的 Ubuntu 服务器 LAMP 安装的 MySQL 分配的内存非常少,需要大量的磁盘交换,即使在内存明显过剩的机器上也是如此。

请注意,我没有尝试查看哪个设置解决了问题,但我在 100K 行上运行的命令以前运行了几个小时,现在只需要几秒钟。

[mysqld]
key_buffer_size         = 256M
max_allowed_packet      = 16M

# Added
innodb_buffer_pool_size = 2G
innodb_log_buffer_size  = 64M
innodb_log_file_size    = 64M
skip_name_resolve

query_cache_limit       = 16M
query_cache_size        = 64M

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多