【HBase列式存储数据库】

一、先明确 HBase 表的核心特点(和MySQL表的关键区别)

HBase 是列式存储的 NoSQL 数据库,表结构和 MySQL 完全不同,核心概念先记牢:

HBase 核心概念 通俗解释 类比 MySQL
RowKey(行键) 唯一标识一行数据,按字典序排序,是查询的唯一索引 主键(PRIMARY KEY)
Column Family(列族) 列的集合,所有列必须归属某个列族(表创建时必须指定) 无(MySQL无列族概念)
Column Qualifier(列限定符) 列族下的具体列(可动态新增,无需提前定义) 普通列(如name/age)
Timestamp(时间戳) 数据版本号,同一份数据可保留多个版本 无(MySQL需手动加版本字段)

二、实战例子:用户行为日志表(最典型的 HBase 应用场景)

假设我们要存储电商平台的用户行为日志,需要支持:

  • 按用户ID快速查询(RowKey);
  • 记录用户的点击、下单、支付等行为(动态列);
  • 保留行为的时间版本(时间戳)。
  1. 表结构设计
维度 具体设计 说明
表名 user_behavior 存储用户行为日志
列族 cf1(行为信息) 存放点击、下单、支付等行为数据
列族 cf2(用户信息) 存放用户基础信息(如手机号、性别)
RowKey 设计 userid_行为时间戳 例:1001_1710600000(用户1001,2026-03-16 10:00:00的行为)
  1. 表中实际存储的数据(可视化)
    一个---1001_1710600000是一行,cf1是大列,里面可以有不同的小列,共同组成一行,
RowKey cf1(行为信息) cf2(用户信息)
click:商品ID=123(时间戳1) phone=138xxxx1234
1001_1710600000 order:订单ID=456(时间戳2) gender=男
pay:支付金额=99(时间戳3)
----------------- -------------------------------- ----------------------
1001_1710603600 click:商品ID=789(时间戳4) phone=138xxxx1234
cart:加入购物车=789(时间戳5) gender=男
----------------- -------------------------------- ----------------------
1002_1710600000 click:商品ID=101(时间戳6) phone=139xxxx5678
order:订单ID=102(时间戳7) gender=女

3. 核心特点体现

  • 动态列 :cf1 列族下可以随时新增 collect(收藏)、cancel(取消订单)等列,无需修改表结构;
  • 多版本:如果用户1001的手机号改了,cf2:phone 会保留新旧两个版本(不同时间戳);
  • RowKey 排序 :所有行按 RowKey 字典序排列,查询用户1001的所有行为时,只需扫描 1001_ 开头的RowKey,速度极快。

原来的HBase表user_behavior里,cf1列族下只有click/order/pay/cart这些列:

RowKey cf1(行为信息) cf2(用户信息)
1001_1710600000 click:商品ID=123 order:订单ID=456 phone=138xxxx1234 gender=男

现在想加「收藏商品」的行为,直接插数据就行,不用改表!

bash 复制代码
# 新增cf1:collect列(收藏),无需ALTER TABLE,直接插入
put 'user_behavior', '1001_1710600000', 'cf1:collect', '商品ID=123'

# 再新增cf1:cancel列(取消订单),同样直接插
put 'user_behavior', '1001_1710600000', 'cf1:cancel', '订单ID=456'

加完之后,表数据变成这样(列是动态多出来的):

RowKey cf1(行为信息) cf2(用户信息)
1001_1710600000 click:商品ID=123 order:订单ID=456 collect:商品ID=123 cancel:订单ID=456 phone=138xxxx1234 gender=男

4."动态列"到底是什么意思?(对比MySQL秒懂)

操作场景 HBase(动态列) MySQL(固定列)
新增「收藏」列 直接用put插入cf1:collect,表结构不变 必须执行ALTER TABLE user_behavior ADD COLUMN collect VARCHAR(20)
不同行可以有不同列 1001行有collect列,1002行可以没有,不影响 所有行必须有相同列,哪怕1002行的collect值为NULL
列的数量无限制(理论上) cf1列族下想加多少列就加多少,无需提前规划 列数量有限制(MySQL单表最多4096列),且加列会锁表

三、为什么HBase能支持动态列?(核心原因)

HBase的存储逻辑是「列族是固定的,但列族下的列限定符是动态的」:

  1. 创建表时,只需要定义「列族」(比如cf1、cf2),不用定义列族里的具体列;
  2. 插入数据时,列族后加「:列名」就是新列(比如cf1:collect),HBase会自动识别;
  3. 每一行可以有不同的列,比如1001行有collect,1002行可以没有,存储时只存"有值的列",不浪费空间。

而MySQL是「行式存储」,必须提前定义所有列,每一行都要占用所有列的存储空间(哪怕值为NULL),所以不能动态加列。


四、举个实际业务场景(更易理解)

比如电商平台突然要加「用户分享商品」的行为记录:

  • 用HBase :开发人员直接在代码里写put 'user_behavior', '1001_1710600000', 'cf1:share', '商品ID=123',不用找DBA改表,5分钟上线;
  • 用MySQL :需要先提工单给DBA,执行ALTER TABLE加列,还要考虑锁表、数据迁移,可能要等几小时甚至半天。

总结(记这3句话就够)

  1. HBase动态列 = 列族下的列可以随时加,不用改表结构
  2. 核心优势:适配业务快速变化(比如新增行为类型、新增用户属性),不用停服务、不用改表;
  3. 对比MySQL:MySQL加列要改表结构、锁表,HBase加列直接插数据,灵活度拉满。

简单说,HBase的动态列就像「在笔记本上随便加行写字,不用提前画好格子」,而MySQL是「必须先画好固定格子,只能在格子里写字」。


三、HBase 表的常用操作命令(对应例子)

  1. 创建表(必须指定列族)
bash 复制代码
# 创建user_behavior表,指定2个列族cf1、cf2
create 'user_behavior', 'cf1', 'cf2'
  1. 插入数据(Put)
bash 复制代码
# 给RowKey=1001_1710600000插入数据
put 'user_behavior', '1001_1710600000', 'cf1:click', '商品ID=123'
put 'user_behavior', '1001_1710600000', 'cf1:order', '订单ID=456'
put 'user_behavior', '1001_1710600000', 'cf2:phone', '138xxxx1234'
  1. 查询数据(Get/Scan)
bash 复制代码
# 按RowKey查询单行数据(最快,HBase推荐方式)
get 'user_behavior', '1001_1710600000'

# 扫描用户1001的所有行为(按RowKey前缀匹配)
scan 'user_behavior', {ROWPREFIXFILTER => '1001_'}

# 只查询cf1列族的所有数据
scan 'user_behavior', {COLUMNS => 'cf1'}
  1. 更新数据(Put覆盖,保留多版本)
bash 复制代码
# 更新用户1001的手机号,HBase会保留新旧版本(不同时间戳)
put 'user_behavior', '1001_1710600000', 'cf2:phone', '138xxxx5678'
  1. 删除数据(Delete)
bash 复制代码
# 删除某一行的某列
delete 'user_behavior', '1001_1710600000', 'cf1:pay'

# 删除整行数据
deleteall 'user_behavior', '1001_1710600000'

四、和 MySQL 表的对比

对比维度 HBase 表(user_behavior) MySQL 表(user_behavior)
结构灵活性 列可动态新增,无需改表 新增列必须 ALTER TABLE
查询方式 仅支持RowKey索引查询 支持主键、普通索引、多条件查询
数据版本 自动保留多版本 需手动添加版本字段
存储方式 列式存储(按列族存) 行式存储(按行存)
适用场景 海量数据、高并发、实时读写 中小数据量、复杂SQL查询

一、先明确 MySQL 表的核心特点(和 HBase 对比)

MySQL 是行式存储的关系型数据库(RDBMS),表结构需提前定义,支持复杂 SQL、多索引、事务,核心特点如下:

MySQL 核心概念 通俗解释 对比 HBase
主键(PRIMARY KEY) 唯一标识一行数据,可自定义(如自增ID、用户ID) 对应 HBase 的 RowKey,但 HBase 仅支持 RowKey 索引
列(Column) 需提前定义列名、数据类型,不可动态新增 对应 HBase 的列限定符,但 HBase 列可动态新增
索引(Index) 可给非主键列建索引(如手机号、订单ID),加速查询 HBase 无普通索引,仅 RowKey 可查
事务(Transaction) 支持ACID,保证数据一致性(如转账、下单) HBase 原生不支持事务

二、实战例子:用户行为日志表(和 HBase 同一场景)

场景和上一轮一致:存储电商平台用户行为日志,支持按用户ID、行为类型、时间范围查询。

  1. 表结构设计(必须提前定义所有列)
sql 复制代码
-- 创建用户行为日志表
CREATE TABLE `user_behavior` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `user_id` VARCHAR(20) NOT NULL COMMENT '用户ID',
  `behavior_type` VARCHAR(10) NOT NULL COMMENT '行为类型:click/order/pay/cart',
  `target_id` VARCHAR(20) NOT NULL COMMENT '目标ID:商品ID/订单ID',
  `behavior_time` DATETIME NOT NULL COMMENT '行为发生时间',
  `amount` DECIMAL(10,2) DEFAULT 0 COMMENT '支付金额(仅pay类型有值)',
  `phone` VARCHAR(11) COMMENT '用户手机号',
  `gender` CHAR(1) COMMENT '用户性别:男/女',
  PRIMARY KEY (`id`),  -- 主键索引
  INDEX `idx_user_id` (`user_id`),  -- 给用户ID建普通索引
  INDEX `idx_user_time` (`user_id`, `behavior_time`)  -- 联合索引(用户ID+时间)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='电商用户行为日志表';
  1. 表中实际存储的数据(可视化)
id user_id behavior_type target_id behavior_time amount phone gender
1 1001 click 123 2026-03-16 10:00:00 0.00 138xxxx1234
2 1001 order 456 2026-03-16 10:00:05 0.00 138xxxx1234
3 1001 pay 456 2026-03-16 10:00:10 99.00 138xxxx1234
4 1001 click 789 2026-03-16 11:00:00 0.00 138xxxx1234
5 1002 click 101 2026-03-16 10:00:00 0.00 139xxxx5678
  1. 核心特点体现
  • 固定列结构 :所有列(如behavior_type、amount)必须提前定义,新增列需执行 ALTER TABLE
  • 多索引:除了自增主键id,还给user_id、(user_id+behavior_time) 建了索引,支持多维度快速查询;
  • 行式存储:每一行是一个完整的行为记录,查询时按行读取(和 HBase 列式存储相反);
  • 数据类型严格:amount是小数、behavior_time是时间类型,MySQL 会做类型校验(HBase 所有数据都是字符串)。

三、MySQL 表的常用操作命令(对应例子)

  1. 插入数据(INSERT)
sql 复制代码
-- 插入单条数据
INSERT INTO user_behavior (user_id, behavior_type, target_id, behavior_time, amount, phone, gender)
VALUES ('1001', 'click', '123', '2026-03-16 10:00:00', 0.00, '138xxxx1234', '男');

-- 批量插入
INSERT INTO user_behavior (user_id, behavior_type, target_id, behavior_time, amount, phone, gender)
VALUES 
('1001', 'order', '456', '2026-03-16 10:00:05', 0.00, '138xxxx1234', '男'),
('1001', 'pay', '456', '2026-03-16 10:00:10', 99.00, '138xxxx1234', '男');
  1. 查询数据(SELECT,支持复杂条件)
sql 复制代码
-- 按用户ID查询所有行为(用索引,速度快)
SELECT * FROM user_behavior WHERE user_id = '1001';

-- 按用户ID+时间范围查询(联合索引)
SELECT * FROM user_behavior 
WHERE user_id = '1001' AND behavior_time BETWEEN '2026-03-16 10:00:00' AND '2026-03-16 11:00:00';

-- 统计用户1001的支付总金额(复杂聚合)
SELECT SUM(amount) FROM user_behavior WHERE user_id = '1001' AND behavior_type = 'pay';

-- 多条件筛选:女性用户的下单行为
SELECT * FROM user_behavior WHERE gender = '女' AND behavior_type = 'order';
  1. 更新数据(UPDATE,支持精准修改)
sql 复制代码
-- 修改用户1001的手机号(精准更新)
UPDATE user_behavior SET phone = '138xxxx5678' WHERE user_id = '1001';

-- 修改某条支付记录的金额
UPDATE user_behavior SET amount = 89.00 WHERE id = 3;
  1. 删除数据(DELETE)
sql 复制代码
-- 删除用户1002的点击记录
DELETE FROM user_behavior WHERE user_id = '1002' AND behavior_type = 'click';

-- 删除3天前的旧日志(按时间删除)
DELETE FROM user_behavior WHERE behavior_time < DATE_SUB(NOW(), INTERVAL 3 DAY);
  1. 新增列(需修改表结构)
sql 复制代码
-- 新增"是否取消订单"列(HBase可动态加,MySQL需ALTER)
ALTER TABLE user_behavior ADD COLUMN is_cancel TINYINT DEFAULT 0 COMMENT '是否取消订单:0-否,1-是';

四、和 HBase 表的核心对比(同一场景)

对比维度 MySQL 表(user_behavior) HBase 表(user_behavior)
表结构 固定列,需提前定义所有字段 列族固定,列可动态新增
查询能力 支持多条件、聚合、排序、联表 仅支持RowKey前缀/范围查询,无复杂聚合
索引 主键、普通索引、联合索引 仅RowKey索引
数据类型 严格类型(时间、小数、字符串) 所有数据都是字符串
事务 支持ACID(如下单+支付原子性) 原生不支持事务
存储规模 适合千万级以下数据 适合亿级、十亿级海量数据
并发能力 高并发读写易瓶颈 支持高并发(百万级QPS)

总结

  1. MySQL 表核心:固定列结构、支持多索引和复杂SQL、事务安全,适合中小数据量、复杂查询的业务场景(如电商订单、用户管理);
  2. 和 HBase 表的选择逻辑
    • 需复杂查询(如统计、多条件筛选)→ 选 MySQL;
    • 海量数据、高并发、动态列 → 选 HBase;
  3. 实战场景:电商中,用户基础信息存 MySQL(需事务、复杂查询),用户行为日志存 HBase(海量、高并发)。

总结

  1. HBase 表核心:以 RowKey 为唯一索引,列族为列的分组,支持动态列和多版本,适合海量、高并发、实时读写的场景;
  2. 典型例子:用户行为日志、物联网时序数据、订单流水等,核心是"按RowKey快速查,动态存多维度数据";
  3. 和MySQL的关键区别:HBase 放弃了复杂SQL和多索引,换来了海量数据的高性能读写。
相关推荐
IvorySQL7 小时前
PostgreSQL 技术日报 (4月6日)|内核补丁与性能优化速递
数据库·postgresql·开源
IvorySQL7 小时前
PostgreSQL 技术日报 (4月5日)|六大核心补丁进展,生产环境必看
数据库·postgresql·开源
想唱rap8 小时前
线程的同步与互斥
linux·运维·服务器·数据库·mysql
IvorySQL8 小时前
走进高校,走近开源|IvorySQL 社区即将亮相应急管理大学开源学术报告会
数据库·postgresql·开源
splage8 小时前
Oracle分页sql
数据库·sql·oracle
jwn9998 小时前
Laravel5.x核心特性全解析
android·php·laravel
光泽雨8 小时前
mysql 约束
数据库·mysql
studyForMokey9 小时前
【Android面试】RecylerView专题
android·spring·面试
scan72410 小时前
龙虾读取session历史消息
java·前端·数据库
TDengine (老段)10 小时前
TDengine IDMP 可视化 —— 饼图
大数据·数据库·人工智能·物联网·时序数据库·tdengine·涛思数据