AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 310
Accepted
Derek Downey
Derek Downey
Asked: 2011-01-06 13:14:01 +0800 CST2011-01-06 13:14:01 +0800 CST 2011-01-06 13:14:01 +0800 CST

加快 MyISAM 到 InnoDB 的转换

  • 772

我有一个 mysql 5.1 服务器,它的数据库大约有 450 个表,占用 4GB 。这些表中的绝大多数(除了 2 个)都是 MyIsam。这在大多数情况下都很好(不需要事务),但是应用程序一直在获得流量,并且某些表由于更新时的表锁定而受到影响。这就是现在有 2 个表是 InnoDB 的原因。

较小表(100k 行)上的转换根本不需要很长时间,导致停机时间最短。然而,我的一些跟踪表接近 5000 万行。有没有办法加快ALTER TABLE...ENGINE InnoDB大桌子的速度?如果没有,是否还有其他方法可以将这些写入繁重的表的停机时间最小化?

mysql-5 storage-engine
  • 3 3 个回答
  • 2933 Views

3 个回答

  • Voted
  1. Best Answer
    randomx
    2011-01-07T13:03:16+08:002011-01-07T13:03:16+08:00

    首先让我说,我讨厌 ALTER。这是邪恶的,恕我直言。

    说,这是您当前的表架构 -

    CREATE TABLE my_table_of_love (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    my_value VARCHAR(40),
    date_created DATE,
    PRIMARY KEY(id)
    ) ENGINE=MyISAM CHARSET=utf8;
    

    这是我推荐的路径 -

    创建一个将替换旧表对象的新表对象:

    CREATE TABLE my_table_of_love_NEW (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    my_value VARCHAR(40),
    date_created DATE,
    PRIMARY KEY(id)
    ) ENGINE=InnoDB CHARSET=utf8
    

    按名称将旧表中的所有行插入到新表中:

    INSERT INTO my_table_of_love_NEW (id,my_value,date_created)
    SELECT id,my_value,date_created FROM my_table_of_love;
    

    冒烟测试您的迁移:

    SELECT COUNT(*) FROM my_table_of_love_NEW;
    SELECT COUNT(*) FROM my_table_of_love;
    SELECT a.id,a.my_value,a.date_created FROM my_table_of_love_NEW a
    LEFT JOIN my_table_of_love b ON (b.id = a.id)
    WHERE a.my_value != b.my_value;
    

    交换表名,以便在需要回滚时维护备份。

    RENAME TABLE my_table_of_love TO my_table_of_love_OLD;
    RENAME TABLE my_table_of_love_NEW TO my_table_of_love;
    

    进行回归测试。

    对于具有多个索引和数百万行的表,这种方法变得越来越可取。

    想法?

    • 10
  2. Brian Ballsun-Stanton
    2011-01-07T03:05:14+08:002011-01-07T03:05:14+08:00

    1) 损失保护是偏执狂的功能。始终进行备份。如果您真的很偏执,请进行备份,然后从备份中恢复。

    2)MySQL手册的这个页面有转换表类型的说明。

    将表更改为 InnoDB 的最快方法是直接对 InnoDB 表进行插入。也就是说,使用 ALTER TABLE ... ENGINE=INNODB,或者创建一个具有相同定义的空 InnoDB 表,并使用 INSERT INTO ... SELECT * FROM ... 插入行。

    3) PostgreSQL 做全文搜索,Sphinx引擎似乎是为 MySQL 做的

    • 7
  3. TomaszSobczak
    2011-01-07T03:05:32+08:002011-01-07T03:05:32+08:00

    当您只使用一个引擎时,优化整个服务器(内存配置、缓存、索引)要容易 X 倍。在大型数据库上混合 myisam 和 innodb 总是会卡在某个点,因为这两个引擎都需要妥协才能正常工作(但不是很好:)

    我建议您对一些专用的全文搜索引擎感兴趣,如sphinx、 lucene ( solr ) 并从数据库层摆脱它。

    • 3

相关问题

  • 使用 Sphinx 存储引擎的优点和缺点是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve