数据库索引执行原理

【索引原理】
唯一索引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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BB-X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值