【索引原理】 唯一索引logid,则包含logid检索的性能(索引B树由logid建立) 唯一索引logid,addr,则包含logid检索的性能,不包含addr检索的性能(索引B树由logid前缀和addr后缀建立) 【索引应用】 create unique index submit_det_logid_addr_uindex on submit_det (logid, addr); create index submit_det_addr_index on submit_det (addr); 高频查询logid或addr,则要再建立addr的单独索引 【索引示例】 create unique index submit_det_logid_addr_uindex on submit_det (logid, addr); 索引树节点模拟:[5:A, 5:E] - [10:C, 10:D] - [12:B, 12:G] 说明:前缀是logid(有序),后缀是addr(logid组内有序) 所以:logid查询可以有效利用索引数二分查询O(log n) addr可以在logid查到的数据集内再二分查找,但是不能单独直接二分查 【索引案例】 如果查询条件是where logid=1 and logname='xu'(条件顺序不影响,DBMS解析器会预处理) 则索引执行是,先通过logid在组合索引(logid, addr)中查询到logid=1的一组目标数据, 再从组内的数据内存地址取到完整的数据行(回表),逐一遍历是否匹配logname='xu'的结果集返回O(n) 【索引推演】 正是由于检索走索引会涉及回表的操作,所以在某些特定的场景下,使用索引不一定就比不使用快 情况一:表数据量很少(全表遍历很快) 情况二:表索引列的数据相同率很高(索引树节点就很少,二分查找到的目标数据集很大,会有大量回表拿数据匹配) ======================================================================================= DROP TABLE IF EXISTS submit_det; CREATE TABLE submit_det ( -- 固定列 detid int auto_increment primary key comment '详情ID', ctime datetime default now() comment '创建时间', -- 属性列 logid int not null comment '日志ID', logname varchar(128) not null comment '日志名称', mode varchar(2) not null comment '操作模式(A新增/M修改/D删除/R替换/T转换/C拷贝)', addr varchar(512) not null comment '文件地址' ) comment '提交日志详情表'; create unique index submit_det_logid_addr_uindex on submit_det (logid, addr); create index submit_det_addr_index on submit_det (addr);
数据库索引执行原理
于 2024-12-12 15:45:18 首次发布