前言
mysql 是传统关系型 oltp 数据库,面向在线事务处理,主打低延迟、高并发的行级读写;hive 是基于 hadoop 的数据仓库 olap 工具,通过 hql(类 sql)将查询转为 mapreduce/spark 任务,面向海量数据离线分析。
两者都遵循 ansi sql 标准,基础语法高度兼容,但底层架构与业务场景的差异,导致语法、功能边界存在大量本质区别。
一、核心相同点
两者基础 sql 体系高度一致,有 mysql 基础可以快速上手 hive。
1. 基础 sql 结构完全对齐
都遵循标准 sql 的编写逻辑,核心语法通用:
- 查询结构:
select ... from ... where ... group by ... having ... order by ... limit ... - 关联查询:支持
inner join/left join/right join/full join - 子查询:支持 from 派生表、基础条件子查询
- 条件逻辑:
if/case when/coalesce/nullif等用法基本一致
2. 常用函数高度重合
- 聚合函数:
count / sum / avg / max / min语法与行为完全一致 - 字符串函数:
concat / substring / length / trim / replace等通用 - 日期函数:
datediff / date_add / date_format等核心函数用法相同 - 条件函数:
if / case when / coalesce逻辑一致
3. 高级语法兼容
- 都支持视图(view)创建,用于简化复杂查询、做权限控制
- mysql 8.0 与 hive 2.0+ 都支持窗口函数(
row_number / rank / lag / lead等),语法与使用方式基本一致 - 都支持
with公用表表达式(cte),提升复杂 sql 的可读性 - 都支持
grant / revoke权限管理语法
二、核心不同点(分模块详解)
语法差异的本质是:mysql 面向行级事务与实时查询,hive 面向海量数据离线批处理。
1. 数据类型差异
基础类型细节差异
表格
| 维度 | mysql | hive |
|---|---|---|
| 字符串 | char / varchar(强制长度限制) | 默认用 string(无长度限制),也支持 varchar |
| 布尔值 | 用 tinyint(1) 模拟(0/1) | 原生支持 boolean 类型(true/false) |
| 数值类型 | 支持无符号整数(int unsigned) | 数值类型默认均为有符号 |
| 枚举 / 集合 | 原生支持 enum / set | 无对应类型,用 string 或复杂类型替代 |
hive 独有复杂数据类型(核心差异)
hive 为处理半结构化、嵌套数据设计了 4 种复杂类型,mysql 原生不支持:
array<t>:有序数组,如array<string>map<k,v>:键值对集合,如map<string, int>struct<col1:t1, col2:t2>:结构体,嵌套多个字段uniontype<t1,t2>:联合类型,可存储多种类型
2. ddl(数据定义)语法差异
建表核心逻辑完全不同
mysql 建表:核心是引擎、约束、索引,围绕事务与查询加速设计
create table user ( id int primary key auto_increment, name varchar(20) not null, age int, index idx_name(name) ) engine=innodb default charset=utf8mb4;
支持主键、外键、唯一约束、自增主键、索引,是 oltp 的基础。
hive 建表:核心是存储格式、行解析、分区分桶,围绕海量数据存储与裁剪设计,无主键、无外键、无自增字段
create table dwd.user_info ( user_id bigint, user_name string, tags array<string> ) partitioned by (dt string) -- 分区字段(虚拟字段,不存数据文件) clustered by (user_id) into 32 buckets -- 分桶 row format delimited fields terminated by '\t' -- 字段分隔符 stored as orc; -- 存储格式(orc/parquet/textfile)
分区表的本质差异
- mysql 分区:表内物理分区,分区字段是真实字段,仅用于单表查询优化,使用频率低。
- hive 分区:hdfs 目录级拆分,每个分区对应一个独立目录,分区字段是虚拟字段,是数仓分层、数据裁剪的核心优化手段,属于高频核心语法。
表的分类差异
hive 表分为内部表(管理表)和外部表,mysql 无此概念:
- 内部表:
drop table时,元数据 + hdfs 数据一起删除 - 外部表:
drop table仅删除元数据,hdfs 文件保留,适合数据共享、多表复用
视图特性差异
- mysql 视图满足条件时可更新,可以通过视图修改基表数据
- hive 视图是纯只读的,仅用于简化查询,不能通过视图执行 insert/update/delete
3. dml(数据操作)语法差异
写入:单条写入 vs 批量写入
- mysql:行级写入是核心能力,支持
insert ... values()单条 / 批量插入,支持insert ... on duplicate key update写入更新,性能极高。 - hive:
- 几乎不用单条
insert values,单条写入会触发一个完整的 mapreduce 任务,延迟极高; - 主流写入方式:
insert into/overwrite table ... select ...,从其他表批量导入; - 独有
insert overwrite:覆盖写入(先清空目标表 / 分区,再写入新数据),mysql 需通过 delete + insert 实现; - 常用入库方式:
load data inpath直接加载 hdfs 上的文件。
- 几乎不用单条
更新与删除:行级操作 vs 批处理
- mysql:
update ... set ... where、delete from ... where是标准行级操作,基于索引性能极高,是 oltp 核心。 - hive:
- 早期版本完全不支持行级 update/delete;
- 0.14 版本后仅 acid 事务表支持更新删除,但本质是重写整个数据文件,性能极差,不适合高频操作;
- 数仓最佳实践:不做行级更新,用分区覆盖、增量写入替代。
4. 查询语法差异
排序:全局排序 vs 分布式排序
- mysql:
order by是全局排序,由数据库引擎直接完成,效率高。 - hive:
order by也是全局排序,但会强制只用 1 个 reducer,大数据量下性能极差,仅小数据量使用;- 独有
sort by:分区内排序(每个 reducer 内部有序,全局无序),并行度高; - 独有
distribute by:按指定字段将数据分发到不同 reducer,控制数据分布; cluster by=distribute by+sort by,兼具分发与排序。
join:能力边界不同
- 共有能力:都支持内连接、左连接、右连接、全外连接。
- hive 独有:
left semi join(左半连接),等价于in子查询,性能远高于子查询;mysql 需用in / exists间接实现。 - hive 限制:仅支持等值 join(on 子句只能用
=,不支持>/<等非等值条件);mysql 支持非等值 join。
子查询支持程度
- mysql:支持 where 子查询、from 派生表、相关子查询,灵活度高,优化成熟。
- hive:早期版本不支持 where 中的 in/exists 子查询,当前版本虽支持但优化差、性能低;官方推荐用 join 替代子查询;相关子查询支持场景非常有限。
hive 独有查询特性
- 抽样查询:
tablesample用于海量数据下快速验证逻辑,mysql 无原生支持select * from user_info tablesample(bucket 1 out of 10 on user_id);
- 行转列炸裂:
explode()+lateral view,可将 array/map 拆分为多行;mysql 需通过 json_table 或 union all 复杂实现。
5. 函数体系差异
基础函数大部分对齐,但 hive 针对数仓场景做了大量扩展:
- 聚合扩展:
collect_set()/collect_list(),将字段聚合成去重 / 不去重的数组;mysql 需用json_arrayagg间接实现。 - 复杂类型函数:
size()/array_contains()/map_keys()/map_values()等,专门处理 array/map/struct,mysql 无对应函数。 - 字符串处理:
split()按分隔符拆分数组,mysql 需用substring_index逐个截取。 - 时间转换:
from_unixtime()/unix_timestamp()是 hive 最常用的时间转换函数,mysql 虽有但使用频率低。
6. 事务与锁机制
- mysql:完整支持 acid 事务,支持行级锁、表级锁,4 种隔离级别,并发读写能力强,是 oltp 的核心。
- hive:原生设计无事务,后续引入的 acid 事务基于文件实现,性能极低;锁为表级 / 分区级锁,仅用于防止元数据并发修改,不支持行级锁;数仓场景下几乎不使用事务。
7. 其他特性差异
- 存储过程与触发器:mysql 支持存储过程、自定义函数、触发器;hive 不支持存储过程、触发器,通过 udf/udaf/udtf 自定义函数扩展能力。
- 索引:mysql 以 b+ 树索引为核心优化手段;hive 索引功能弱、使用极少,优化靠分区、分桶、列式存储、文件裁剪。
- 变量:都支持自定义变量,但 hive 通过
set命令配置任务参数与自定义变量,更偏向任务级配置。
三、差异总结与本质原因
表格
| 维度 | mysql(oltp) | hive(olap) |
|---|---|---|
| 核心场景 | 在线事务、行级读写 | 离线分析、批量计算 |
| 数据量 | 百万 - 千万级 | 亿 - 千亿级 |
| 延迟 | 毫秒级 | 秒 - 分钟级 |
| 核心优化 | 索引、事务、锁 | 分区、分桶、列式存储 |
| 写入特点 | 高频行级增删改 | 批量写入、少更新 |
| 排序特点 | 全局排序高效 | 全局排序低效,推荐分布式排序 |
总结
到此这篇关于mysql与hive语法异同点详解的文章就介绍到这了,更多相关mysql与hive语法异同点内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论