将 Mysql 与 MyISAM 一起用作带有石英调度程序的数据库引擎

Using Mysql with MyISAM as db engine with quartz scheduler

我有一个遗留应用程序,它使用 Mysql 5.6 数据库,数据库引擎为 MyISAM。现在我需要编写 quartz 调度程序来触发多个 quartz 作业。为此,我使用的是 quartz 2.3.2。要使用 quartz,我需要在我的模式中创建 quartz 表,我从 Here 的 quartz repo 的 github 获得了表创建脚本。

当我尝试使用 MyISAM 数据库引擎创建表时失败了,因为主键的长度超过 1000 字节。错误低于-

Query: CREATE TABLE QRTZ_JOB_DETAILS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
    IS_DURABLE VARCHAR(1) NOT NULL,
    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
)ENGINE=MYISAM;

Error Code: 1071
Specified key was too long; max key length is 1000 bytes

我正在使用 utf8 作为字符编码。

如果我用 InnoDB 尝试它,它工作正常。

问题是这个遗留应用程序中的所有其他表都使用 MyISAM 作为数据库引擎。那么我可以只将 InnoDB 用于 quartz 相关表吗?因为我不确定以后会不会有任何性能问题,因为我为不同的表使用不同的引擎。 有人可以帮我解决这个问题吗?

MyISAM 数据库引擎的以下错误在 MySql 中被报告为错误:

Error Code: 1071
Specified key was too long; max key length is 1000 bytes

已举报here

Mysql 开发人员说这不是bug,但它的局限性,它有其他选择,因此它的优先级较低。

由于 UTF-8 每个字符占用 3 个字节

latin1 = 1 个字节 = 1 个字符

uft8 = 3 个字节 = 1 个字符

现在我只使用 latin1 作为 quartz 表的字符编码,因为 quartz repo 中给出的种子脚本不会 运行。

  • 完整的 UTF-8 需要 utf8mb4,每个字符最多占用 4 个字节。
  • 切换到InnoDB;性能会更好。也许即使您有多个表(一些 MyISAM,一些 InnoDB)
  • 切换到InnoDB;停电后您将不必 REPAIR 表。
  • 在删除 MyISAM 之前切换到 InnoDB。
  • 如果您的JOB_NAMEs(等)不是真正的 200 个字符,请缩短声明。
  • 如果您的 JOB_NAMEs(等)仅使用 ascii,则切换 CHARACTER SET。 (可以混合字符集;但是,这可能会导致 JOINs.
  • 上出现一些问题
  • 规范化SCHED_NAME;它在很多表中浪费了很多 space。