3

最近在我们的一个讨论中提到,使用基于 MyISAM 的旧 MySQL 部署移动旧的遗留系统不能轻易地被基于 InnoDB 的 MySQL 或 MariaDB 部署取代。出现的原因是到处都有太多的 MyISAM only SQL 命令。我还没有看到代码,所以我想知道他们指的是什么 SQL 命令。

我只知道下面几个与表锁定相关的。它可能在理论上仍然可以与 InnoDB 一起使用,但更适合 MyISAMMERGEMEMORY支持表锁定的存储引擎。

LOCK TABLES
UNLOCK TABLES

如果还有更多,或者点我收藏一下。将不胜感激。

- 编辑 -

我会把我找到的所有其他东西都放在这条线下面。

MATCH (http://dev.mysql.com/doc/refman/5.5/en//fulltext-search.html)
4

2 回答 2

1

您也可以LOCK TABLES使用 InnoDB 表,因此这不是 MyISAM 特定的。虽然没有必要锁定 InnoDB 表。最好使用事务、MVCC 和SELECT...FOR UPDATE.

有许多配置变量和状态变量仅与 MyISAM 相关,例如key_buffer_size将一些内存用于缓存索引。但这些不是命令。

InnoDB 不支持 MyISAM 表的一些特性。一种是分组自增主键:

CREATE TABLE foo (
  group_id INT, 
  position INT AUTO_INCREMENT,
  PRIMARY KEY (group_id, position)
);

上表在position您插入行时递增,但对于 的每个不同值从 1 开始group_id。这仅适用于 MyISAM。

CREATE FULLTEXT INDEX,因此MATCH()...AGAINST()查询谓词目前仅在 MyISAM 中受支持。但是这些是在 MySQL 5.6 中为 InnoDB 实现的。

CREATE SPATIAL INDEX仅在 MyISAM 中受支持。

CHECKSUM TABLE仅适用于 MyISAM 表。

OPTIMIZE TABLE在某些方面特定于 MyISAM,但是当您对 InnoDB 表运行此命令时,它会自动转换为重新创建 + 分析操作。

CREATE TABLE仅 MyISAM 支持的选项:

  • AVG_ROW_LENGTH=nnn
  • DATA_DIRECTORY=路径
  • INDEX_DIRECTORY=路径
  • DELAY_KEY_WRITE=1
  • PACK_KEYS=1
  • ROW_FORMAT=固定

MERGE 存储引擎只能合并 MyISAM 表。

我最喜欢应用于 MyISAM 表的命令如下。:-)

ALTER TABLE tablename ENGINE=InnoDB;
于 2012-11-19T16:30:27.727 回答
0

我更喜欢创建一个“临时”表,插入/更新和删除,删除旧表,而不是将新表重命名为旧名称。

否则你可以在最后一步

TRUNCATE TABLE x;
INSERT INTO x SELECT * from temp_x;
于 2012-11-17T19:14:36.390 回答