作者介绍
数据库内核专家 | 分布式系统架构师
深耕数据库内核架构设计与开发十余年,主导研发多款高性能分布式数据库,攻克高并发、低延迟等核心技术难题。
现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节,从存储引擎到分布式事务,手把手拆解核心模块。
无论你是数据库开发者、系统架构师,还是对底层技术充满好奇的极客,这里都有你想要的「硬核干货」!公众号【开源无限】
系列文章
【手写数据库核心揭秘系列】
1.2 索引的语法解析
1.2.1 索引语法基础
索引的语法是使用索引的第一步,掌握正确的语法才能有效地创建和管理索引。在SQL标准中,索引相关的语法主要包括创建索引、删除索引等操作。
1.2.1.1 创建索引
创建索引的基本语法如下:
CREATE INDEX index_name ON table_name (column1, column2, ...);
其中:
index_name
:索引的名称,通常以idx_
前缀命名,后跟列名table_name
:要创建索引的表名(column1, column2, ...)
:要包含在索引中的列列表
1.2.1.2 指定索引算法
在一些数据库系统中,还可以指定索引算法:
CREATE INDEX index_name ON table_name (column1, column2, ...) USING algorithm;
常见的索引算法包括:
BTREE
:平衡树索引,适用于范围查询HASH
:哈希索引,适用于等值查询FULLTEXT
:全文索引,适用于文本搜索
1.2.2 索引语法的扩展
在MiniToadb中,我们扩展了SQL语法解析功能,增加了对索引创建和删除的支持。下面是具体的实现细节:
1.2.2.1 关键字定义
首先,在sqlgram.y
文件中添加了INDEX
关键字:
%token INDEX
这是实现索引语法解析的第一步,添加了INDEX
关键字用于识别索引相关的SQL语句。
1.2.2.2 语句类型扩展
在stmt
规则中添加了createIndex_stmt
和dropIndex_stmt
:
stmt : create_stmt
{
$$ = $1;
}
| drop_stmt
{
$$ = $1;
}
| createIndex_stmt
{
}
| dropIndex_stmt
{
}
| insert_stmt
这使得解析器能够识别和处理索引相关的语句。
1.2.2.3 索引创建语法
添加了createIndex_stmt
的语法规则:
createIndex_stmt: CREATE INDEX tablename ON tablename '(' column_name_list ')' index_algorithm
{
}
;
此规则定义了CREATE INDEX
语句的语法结构,包括索引名称、表名、列列表和可选的索引算法。
1.2.2.4 索引删除语法
添加了dropIndex_stmt
的语法规则:
dropIndex_stmt: DROP INDEX tablename
{
}
;
此规则定义了DROP INDEX
语句的语法结构,用于删除指定的索引。
1.2.2.5 索引算法指定
添加了index_algorithm
的语法规则,支持默认算法和显式指定算法:
index_algorithm: * empty */
{
}
| USING expr_name
{
}
;
此规则允许用户指定索引算法,如USING BTREE
,或使用默认算法。
1.2.3 索引语法的实践
1.2.3.1 基本用法示例
-- 创建表
CREATETABLEtest (idINT, nameVARCHAR(50));
-- 创建单列索引
CREATEINDEX idx_id ONtest(id);
-- 创建复合索引
CREATEINDEX idx_name_age ONusers(name, age);
-- 创建指定算法的索引
CREATEINDEX idx_name ONtest(name) USING BTREE;
-- 删除索引
DROPINDEX idx_id;
1.2.3.2 语法注意事项
索引名称唯一性:在同一个表中,索引名称必须唯一 列顺序:在复合索引中,列的顺序会影响索引的使用效果 索引类型选择:根据查询模式选择合适的索引类型 索引大小:索引会占用额外的存储空间,需要合理规划
1.2.4 索引语法的解析流程
当解析器遇到索引相关的SQL语句时,会按照以下流程进行处理:
词法分析:将SQL语句分解为词法单元,识别关键字、标识符等 语法分析:根据语法规则构建语法树 语义分析:检查语句的语义正确性,如索引名称是否唯一 生成执行计划:根据语句类型生成相应的执行计划 执行操作:执行索引的创建或删除操作
1.2.5 索引语法的扩展方向
随着数据库技术的发展,索引语法也在不断扩展,未来可能的扩展方向包括:
部分索引:只对表中的部分数据创建索引 表达式索引:基于表达式的索引,如 CREATE INDEX idx_lower_name ON users(LOWER(name))覆盖索引:包含查询所需的所有列的索引 分区索引:与表分区结合的索引 向量索引:支持高维向量数据的索引
1.2.6 小结
索引语法是使用索引的基础,掌握正确的语法对于有效地创建和管理索引至关重要。MiniToadb通过扩展SQL语法解析功能,实现了对索引创建和删除的支持,为后续的索引功能开发奠定了基础。
在实际应用中,需要根据具体的查询模式和数据特点,选择合适的索引类型和创建方式,以达到最佳的性能优化效果。
通过本章节的学习,你已经了解了索引的基本语法和解析原理,为后续深入学习索引的实现细节和优化策略打下了基础。




