准备工作与数据库下载
为支持后续SQL操作演示及索引优化分析,需预先安装MySQL官方示例数据库Sakila。
通过MySQL官网获取数据库文件:
bash
下载链接(官方源)
wget https://downloads.mysql.com/docs/sakila-db.tar.gz
关键细节:
-
下载后获得
sakila-db.tar.gz压缩文件(注意文件名拼写) -
使用
tar命令解压:bashtar -zxvf sakila-db.tar.gz解压后生成
sakila-db目录,内含以下文件:sakila-schema.sql:数据库表结构定义(含索引、约束、存储过程)。sakila-data.sql:示例数据填充脚本。
数据库导入流程
严格按顺序执行导入操作,确保数据结构与数据完整性:
1 ) 导入表结构:
bash
mysql -u [username] -p < sakila-schema.sql
或在 mysql 命令环境中执行
sql
SOURCE /home/user/sakila-db/sakila-schema.sql;
作用:创建 sakila 数据库及 actor, film, inventory 等23张表,初始化主键、外键及索引。
2 ) 导入示例数据:
bash
mysql -u [username] -p < sakila-data.sql
或同上使用 souce 命令
作用:填充16,044条示例数据(如演员、电影、租赁记录),支持后续查询优化实验。
技术要点:
-
若需验证导入状态,登录MySQL后执行:
sqlSHOW DATABASES; -- 确认sakila库存在 USE sakila; -- 切换数据库 SHOW TABLES; -- 查看23张表 SELECT COUNT(*) FROM film; -- 验证数据量(应返回1000条)
3 ) Sakila数据库结构核心解析
补充知识点:Sakila采用典型OLTP设计模式,包含以下关键组件:
| 组件类型 | 示例对象 | 作用 |
|---|---|---|
| 表 | film, customer, rental |
存储业务实体数据 |
| 索引 | idx_title (film表) |
加速基于标题的查询 |
| 视图 | sales_by_store |
聚合各门店销售额 |
| 存储过程 | rewards_report |
生成月度客户奖励报表 |
原生SQL示例(创建索引):
sql
-- 针对film表title字段创建B-Tree索引
CREATE INDEX idx_film_title ON film(title);
-- 针对rental表复合索引优化日期范围查询
CREATE INDEX idx_rental_date ON rental (rental_date, inventory_id);
NestJS集成Sakila数据库(可选)
若需在NestJS中操作Sakila数据库,配置TypeORM模块:
ts
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'your_password',
database: 'sakila', // 指定Sakila数据库
entities: [__dirname + '//*.entity{.ts,.js}'],
synchronize: false, // 禁止自动同步(避免破坏示例数据)
}),
],
})
export class AppModule {}
实体定义示例(Actor表):
typescript
// actor.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity('actor')
export class Actor {
@PrimaryGeneratedColumn({ name: 'actor_id' })
actorId: number;
@Column({ name: 'first_name' })
firstName: string;
@Column({ name: 'last_name' })
lastName: string;
@Column({ name: 'last_update', type: 'timestamp' })
lastUpdate: Date;
}
常见问题排查
-
错误1:
ERROR 1049 (42000): Unknown database 'sakila'原因:未先导入
sakila-schema.sql。解决:严格按顺序执行导入步骤。
-
错误2:外键约束失败(如
Error 1216)原因:
sakila-data.sql导入时依赖表结构完整性。解决:重新按序导入,或暂时禁用外键检查:
sqlSET FOREIGN_KEY_CHECKS = 0; -- 导入前执行 SET FOREIGN_KEY_CHECKS = 1; -- 导入后恢复
总结
通过正确安装Sakila数据库,开发者可获得标准化的SQL优化实验环境。关键要点包括:
- 按序导入表结构与数据(
sakila-schema.sql→sakila-data.sql) - 利用其丰富的业务场景(租赁管理、库存跟踪)验证索引策略
- 结合NestJS实现现代化数据访问层抽象