索引笔记

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

 

索引的作用:

索引可以极大的减少储存引擎需要扫描的数据量

所以可以把随机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

 

posted @ 2021-06-24 21:43  hippoppower  阅读(68)  评论(0)    收藏  举报