索引笔记
索引是为加速数据表的检索而创建的一种分散储存的数据结构

索引的作用:
索引可以极大的减少储存引擎需要扫描的数据量
所以可以把随机IO变成顺序IO
索引可以帮助我们在分组 排序等操作时, 避免使用临时表
二叉树对查找提升的不多, 因为不平衡
平衡二叉树查找, 太深了, 磁盘IO操作次数过多
节点保存的数据量太小, 例如操作系统与磁盘的每次IO的数据交换是一页, 一页=4k, 拿一次IO远远不足4K, 浪费
多路平衡查找树B-Tree

可以把4K用满, 4k=4069, 假设是存int, int(4个字节), 可以保留1024个关键字
这里讲的是操作系统, 而mysql一页是16K, 更大
Mysql使用的是B+Tree


B-Tree可能半路返回结果, B+Tree必须经过所有深度达到叶子节点, 从叶子节点返回数据
但B+更稳定
show variables like 'datadir'

mysql两种数据格式: myisam, innodb
myisam :
MYD真正的用户数据
MYI索引文件




innodb, 没有单独的索引文件, 索引和数据存到一个文件, 数据的物理顺序和索引的逻辑顺序相同. // 所以叫聚集索引, 聚集到一块了
只有主键索引是聚集索引.(携带数据物理地址)
innodb怎么都要进过主键索引去搜索整条数据, 即使用其他条件去查询, 也要查询出主键, 然后经过主键索引查出数据.
好处就是一旦数据发生改变, 其他辅助索引不需要维护, 只维护携带物理地址的主键索引就好.


单列索引, 联合索引


根据最左匹配原则, 建了第二个索引, 就没必要建第一个索引了 .

索引覆盖: 查的字段正好是索引字段, 直接返回索引, 不需要取取物理地址, 减少IO

例如, select* 比写明查询列要好, 写明了有可能覆盖索引
索引建的过多, 插入和删除时, 对所有索引的维护成本过大
like 9999%, 可用到索引; like %99999 用不到索引, 因为%在树结构中, 没办法往下选

where name = 'zs' and age in () //可以用到索引
where age in () and name = 'zs' //无法用索引


由此可见, 索引, like 有可能用, 有可能不用 , gupao模糊匹配的太多, 搜索引擎判断用全表扫描, 多加一点关键字, 判断为用索引
离散型越高的列, 二叉树越喜欢
not in , <> , not exists, 不能触发索引, 因为在树结构上, 哪条路都能走, 无法索引
order by , group by 可以触发索引, 索引本来就有order

浙公网安备 33010602011771号