-- 创建库(指定字符集)
CREATE DATABASE ecommerce_order
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 查看库元数据
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'ecommerce_order';
4. 进阶拆分策略
拆分方式
原理
适用场景
垂直分库
按业务模块拆分
电商拆分为用户库、订单库
水平分库
按哈希/范围分散同业务表
订单表按用户ID分布到多个分库
读写分离
主库写、从库读
提升高并发读场景性能
5. 避坑指南
库与表字符集需统一,避免乱码;
按业务分配最小权限,禁止滥用全库权限;
高频库与低频库分磁盘部署,防止IO瓶颈。
二、表(Table):结构化数据的核心载体
1. 定义与结构
表是RDBMS存储数据的基本单元,由**行(记录)和列(字段)**组成:
列:定义数据类型(如INT、DECIMAL)与约束(主键、外键);
行:存储具体业务数据。
2. 核心属性
(1)字段属性
字段属性
说明
数据类型
影响性能与存储空间,金额用DECIMAL、手机号用CHAR(11)
约束
主键(唯一标识)、外键(关联一致性)、非空、唯一
(2)存储引擎(MySQL特有)
特性
InnoDB(默认)
MyISAM
Memory
事务/外键
支持
不支持
不支持
锁粒度
行级锁
表级锁
表级锁
适用场景
核心业务表
只读统计/日志表
临时缓存表
3. 实战:表的创建
sql复制代码
CREATE TABLE `user` (
`user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` VARCHAR(50) NOT NULL COMMENT '用户名(唯一)',
`mobile` CHAR(11) NOT NULL COMMENT '手机号(唯一)',
`dept_id` INT UNSIGNED COMMENT '部门外键',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`),
UNIQUE KEY `uk_user_name` (`user_name`),
FOREIGN KEY (`dept_id`) REFERENCES `department`(`dept_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户核心表';
4. 避坑指南
避免用VARCHAR存固定长度数据,用INT存金额;
主键优先选自增INT,避免UUID导致索引碎片化;
大字段(如头像)拆分到单独表,降低主表IO开销;
减少冗余字段,遵循3NF避免更新不一致。
三、视图(View):基于查询的虚拟表
1. 定义与本质
视图是存储查询语句的虚拟表,不存储数据,每次访问时执行底层查询返回实时结果。
2. 核心作用
简化复杂查询:封装多表关联、聚合逻辑;
数据安全:只暴露非敏感字段;
逻辑复用:避免重复编写SQL;
屏蔽表结构变更:上层应用无需改动。
3. 分类与实战
视图类型
特点
适用场景
操作示例
普通视图
实时查询
业务数据查询
CREATE VIEW v_user_order AS SELECT u.user_id, o.order_id FROM user u LEFT JOIN order o ON u.user_id=o.user_id;
物化视图
存储物理结果,定期刷新
报表统计
Oracle:CREATE MATERIALIZED VIEW mv_daily_order REFRESH EVERY 1 DAY AS SELECT DATE(create_time), COUNT(*) FROM order GROUP BY DATE(create_time);
递归视图
基于CTE
层级数据(组织架构)
MySQL:CREATE VIEW v_dept_tree AS WITH RECURSIVE dept_cte AS (SELECT * FROM department WHERE parent_id=0 UNION ALL SELECT d.* FROM department d JOIN dept_cte c ON d.parent_id=c.dept_id) SELECT * FROM dept_cte;