【问题标题】:Over-Indexed a MySQL table. How can I remediate?过度索引 MySQL 表。我该如何补救?
【发布时间】:2013-01-15 22:51:00
【问题描述】:

我有一个包含 300 万行和 6 列的表。问题是我的 mysqld 服务器不会为任何查询生成输出,它只会超时。
然后我读到here,过度索引可能涉及过多的数据从内存交换到磁盘,并可能导致服务器速度变慢。
所以我运行了一个查询ALTER TABLE <Tbl_name> DROP INDEX <Index_name>;。此查询已运行 10 小时,尚未完成。

  1. 预计会运行这么长时间吗?
  2. 有没有更好的方法来删除/更改我的索引?

编辑 - 添加 SHOW CREATE TABLE 输出

| Sample | CREATE TABLE `sample` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `FiMD5` varchar(32) NOT NULL,
  `NoMD5` varchar(32) NOT NULL,
  `SeMD5` varchar(32) NOT NULL,
  `SeesMD5` varchar(32) NOT NULL,
  `ImMD5` varchar(32) NOT NULL,
  `Ovlay` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`ID`),
  KEY `FiMD5_3` (`FiMD5`),
  KEY `ID` (`ID`),
  KEY `ID_2` (`ID`),
  KEY `pIndex` (`FiMD5`),
  KEY `FiMD5_` (`FiMD5`,`NoMD5`)
) ENGINE=InnoDB AUTO_INCREMENT=3073630 DEFAULT CHARSET=latin1 |

【问题讨论】:

  • 向我们展示SHOW CREATE <Tbl_name> 的输出和EXPLAIN SELECT ... 的输出
  • 请发布您的表格定义。 300 万行听起来不应该是个大问题。我的猜测是,在 10 小时后,可以肯定地断定某些东西出了问题(除非 mysqld 在 Atari 或其他东西上运行)。

标签: mysql indexing


【解决方案1】:

也许执行以下操作会更快:

  1. SELECT ... INTO OUTFILE第一
  2. 使用TRUNCATE TABLE 删除所有内容
  3. 修改表格
  4. 使用LOAD恢复数据

如果第 2 步耗时过长,可能会删除表并重新创建它。

【讨论】:

  • 我做了第 1 步和第 2 步。现在表格包含 0 行。但我找不到输出文件。我刚刚指定了名称“db_bkup.txt”,我在 Windows 中。 我真诚地希望我的所有数据都没有消失
  • 你刚刚从严重的问题中解脱出来。感谢您提供巧妙的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 2011-10-10
  • 2017-06-19
相关资源
最近更新 更多