MySQL engine.type类型的区别

本文详细介绍了MySQL中的多种存储引擎,包括MyISAM、InnoDB、BDB等,并对比了它们的特点,如支持事务处理的能力、执行速度及移植性等。

MySQL engine /type 类型 InnoDB /MYISAM/ MERGE /BDB/HEAP 的区别

MySQL 参考手册 发现 CREATE TABLE 时有多种数据库存储引擎:

TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }

网上查了下据说 MyISAM InnoDB 两种引擎常用

大至区别如下 [ 不知是否准确 ] :

高级处理 :
MyISAM 类型不支持事务处理等高级处理,而 InnoDB 类型支持。

执行速度 :
MyISAM 类型的表强调的是性能,其执行数度比 InnoDB 类型更快。

移值性 :
MyISAM 类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从 Windows 系统拷贝到 linux 系统中使用。

-----------------------------

今天找到官方准确解释

·          MyISAM :默认的 MySQL 插件式存储引擎,它是在 Web 、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改 STORAGE_ENGINE 配置变量,能够方便地更改 MySQL 服务器的默认存储引擎。

·          InnoDB :用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。

·           BDB :可替代 InnoDB 的事务引擎,支持 COMMIT 、 ROLLBACK 和其他事务特性。

·           Memory :将所有数据保存在 RAM 中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

·          Merge :允许 MySQL DBA 或开发人员将一系列等同的 MyISAM 表以逻辑方式组合在一起,并作为 1 个对象引用它们。对于诸如数据仓储等 VLDB 环境十分适合。

·           Archive :为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

·           Federated :能够将多个分离的 MySQL 服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。

·           Cluster/NDB : MySQL 的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。

·           Other :其他存储引擎包括 CSV (引用由逗号隔开的用作数据库表的文件), Blackhole (用于临时禁止对数据库的应用程序输入),以及 Example 引擎(可为快速创建定制的插件式存储引擎提供帮助)。

请记住,对于整个服务器或方案,你并不一定要使用相同的存储引擎,你可以为方案中的每个表使用不同的存储引擎,这点很重要。

 

CREATE TABLE db 1 .site 1 _groups (
groupid smallint ( 5) unsigned NOT NULL auto_increment ,
name varchar (50) NOT NULL default '',
description text NOT NULL,
group_type varchar (10) NOT NULL default '',
KEY groupid (groupid ),
KEY group_type (group_type )
) Engine=MyISAM ;

 

CREATE TABLE db2.site2_groups (
groupid smallint ( 5) unsigned NOT NULL auto_increment ,
name varchar (50) NOT NULL default '',
description text NOT NULL,
group_type varchar (10) NOT NULL default '',
KEY groupid (groupid ),
KEY group_type (group_type )
) TYPE= MyISAM ENGINE =MERGE UNION=(db1.site1_groups) INSERT_METHOD=FIRST;

经DataX智能分析,该任务最可能的错误原因是: com.alibaba.datax.common.exception.DataXException: Code:[MYSQLErrCode-06], Description:[Column信息错误,请检查该列是否存在,如果是常量或者变量,请使用英文单引号’包起来]. - 执行的SQL为: SELECT MIN(id),MAX(id) FROM c_memcard_class_group 具体错误信息为:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'id' in 'field list' - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'id' in 'field list' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.Util.getInstance(Util.java:408) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2491) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2449) at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1381) at com.alibaba.datax.plugin.rdbms.util.DBUtil.query(DBUtil.java:446) at com.alibaba.datax.plugin.rdbms.util.DBUtil.query(DBUtil.java:433) at com.alibaba.datax.plugin.rdbms.util.DBUtil.query(DBUtil.java:412) at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.checkSplitPk(SingleTableSplitUtil.java:183) at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.getPkRange(SingleTableSplitUtil.java:157) at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.splitSingleTable(SingleTableSplitUtil.java:52) at com.alibaba.datax.plugin.rdbms.reader.util.ReaderSplitUtil.doSplit(ReaderSplitUtil.java:84) at com.alibaba.datax.plugin.rdbms.reader.CommonRdbmsReader$Job.split(CommonRdbmsReader.java:103) at com.alibaba.datax.plugin.reader.mysqlreader.MysqlReader$Job.split(MysqlReader.java:49) at com.alibaba.datax.core.job.JobContainer.doReaderSplit(JobContainer.java:733) at com.alibaba.datax.core.job.JobContainer.split(JobContainer.java:394) at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:117) at com.alibaba.datax.core.Engine.start(Engine.java:86) at com.alibaba.datax.core.Engine.entry(Engine.java:168) at com.alibaba.datax.core.Engine.main(Engine.java:201) at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:41) at com.alibaba.datax.plugin.rdbms.util.RdbmsException.asQueryException(RdbmsException.java:81) at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.checkSplitPk(SingleTableSplitUtil.java:185) at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.getPkRange(SingleTableSplitUtil.java:157) at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.splitSingleTable(SingleTableSplitUtil.java:52) at com.alibaba.datax.plugin.rdbms.reader.util.ReaderSplitUtil.doSplit(ReaderSplitUtil.java:84) at com.alibaba.datax.plugin.rdbms.reader.CommonRdbmsReader$Job.split(CommonRdbmsReader.java:103) at com.alibaba.datax.plugin.reader.mysqlreader.MysqlReader$Job.split(MysqlReader.java:49) at com.alibaba.datax.core.job.JobContainer.doReaderSplit(JobContainer.java:733) at com.alibaba.datax.core.job.JobContainer.split(JobContainer.java:394) at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:117) at com.alibaba.datax.core.Engine.start(Engine.java:86) at com.alibaba.datax.core.Engine.entry(Engine.java:168) at com.alibaba.datax.core.Engine.main(Engine.java:201) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'id' in 'field list' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.Util.getInstance(Util.java:408) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2491) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2449) at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1381) at com.alibaba.datax.plugin.rdbms.util.DBUtil.query(DBUtil.java:446) at com.alibaba.datax.plugin.rdbms.util.DBUtil.query(DBUtil.java:433) at com.alibaba.datax.plugin.rdbms.util.DBUtil.query(DBUtil.java:412) at com.alibaba.datax.plugin.rdbms.reader.util.SingleTableSplitUtil.checkSplitPk(SingleTableSplitUtil.java:183) ... 11 more [2025-10-27 21:39:53] error: datax 抽数失败
最新发布
10-28
该问题属于“普通文本型”。 --- ### 错误核心信息 ```text Unknown column 'id' in 'field list' ``` 执行的 SQL: ```sql SELECT MIN(id), MAX(id) FROM c_memcard_class_group ``` 这表明:**表 `c_memcard_class_group` 中不存在名为 `id` 的列**,但 DataX 配置中使用了 `"splitPk":"id"`,导致其尝试通过 `id` 字段进行数据切分(并发读取),从而引发查询失败。 --- ### 问题根源分析 | 关键点 | 说明 | |--------|------| | ✅ 表结构无 `id` 列 | 实际表可能使用其他主键(如 `class_id`, `group_id` 等),而脚本错误地假设所有表都有 `id` 字段。 | | ❌ 错误配置 `splitPk` | 在 DataX 的 `mysqlreader` 中设置了 `"splitPk":"id"`,但该字段并不存在,DataX 会自动执行 `MIN(id)/MAX(id)` 查询,直接报错。 | | 🔄 自动化脚本缺陷 | 当前生成的配置未判断 `id` 是否存在就强制添加 `splitPk`,导致任务失败。 | --- ### 解决方案 #### ✅ 方案一:**从配置中移除 `splitPk`** 如果该表无需并发读取(即单通道抽取即可),最简单方式是: > 删除或注释掉 JSON 中的 `splitPk` 行: ```json { "connection": [ { "jdbcUrl": ["jdbc:mysql://192.168.100.179:3306/erp"], "table": ["c_memcard_class_group"] // 移除这一行:"splitPk": "id" } ] } ``` 这样 DataX 将以单线程方式全量读取,不再尝试执行 `MIN(id)/MAX(id)`。 --- #### ✅ 方案二:**使用真实存在的字段作为 `splitPk`** 查看表结构,找到一个**数值型且分布均匀的字段**(通常是主键或自增列)。 例如,执行: ```sql DESCRIBE erp.c_memcard_class_group; ``` 假设结果中有: | Field | Type | |-------------|--------------| | group_id | int(11) | | class_code | varchar(50) | 则应将 `splitPk` 改为存在的数值字段: ```json "splitPk": "group_id" ``` ⚠️ 注意:`splitPk` 必须是 **数值类型(int、bigint 等)**,不能是字符串或时间类型。 --- #### ✅ 方案三:**自动化脚本中智能判断并安全处理 `splitPk`(推荐)** 您之前已要求脚本判断是否存在 `id` 列,现确认此逻辑必须严格执行。以下是关键修复建议: ##### 修改模板占位符行为 在 `/zhiyun/liyaoming/jobs/template.json` 中保留: ```json "splitPk": "#SPLITPK#" ``` 然后在 Python 脚本中动态替换: ```python # 查看是否有 id 或类似主键 pk_candidate = None for col, typ in data: if col.lower() == 'id': pk_candidate = col break elif col.lower().endswith('id') and 'int' in typ: pk_candidate = col # 可选:允许 group_id 这类字段 break if pk_candidate: content = content.replace('"#SPLITPK#"', f'"splitPk": "{pk_candidate}"') else: content = content.replace(' "#SPLITPK#",\n', '') \ .replace(' "#SPLITPK#"', '') ``` 这样既能启用合理切分键,又能避免因字段缺失导致任务失败。 --- ### 总结与建议 | 措施 | 操作 | |------|------| | 🔍 第一步 | 使用 `DESCRIBE erp.c_memcard_class_group;` 确认真实字段名 | | 🛠️ 第二步 | 若无 `id`,则不要配置 `splitPk`,或改用其他整型字段 | | ✅ 第三步 | 更新自动化脚本,确保只在字段存在时才启用 `splitPk` | | 💡 建议 | 所有表应在元数据层面标记主键字段,用于自动化识别切分键 | --- ### 最终结论 当前任务失败的根本原因是: > **配置了不存在的 `splitPk:"id"`,导致 DataX 执行 `SELECT MIN(id), MAX(id)` 时报 `Unknown column 'id'` 错误。** ✅ **解决方法**: 修改 DataX 配置,删除 `"splitPk":"id"` 或将其改为表中真实存在的**数值型主键字段**,即可恢复正常抽取。 > 提示:可先手动运行一次 `DESCRIBE erp.c_memcard_class_group;` 获取准确字段结构后再调整配置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值