将 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。
我有一个遗留应用程序,它使用 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。