💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 索引类型 ## B-tree索引 通常我们说的索引就是这个 B-tree索引以B+树的结构存储数据 ![](https://box.kancloud.cn/71cfa5fbd407c4f0294ebbae1f8fbf3e_2534x804.jpg) 每个叶子到根节点的距离都是相同的,并且记录在同一层的叶子节点中是按大小顺序存放的,并且各个叶子节点是由指针连接的 这样做的好处就是方便去快速查找,索引大小远小于表中数据的大小 不同存储引擎实现方式也不同 myisam在叶子节点是通过物理位置来引入行的 innodb是通过主键来引入行的 **适用场景** * 顺序存储,适合范围查找 * 匹配最左前缀的索引,混合索引 * 匹配列前缀查询,左原则 * 精确匹配左前列并范围匹配另外一列, xx='xx' and xx<xx * 只访问索引的查询,select 索引 * 适合在order by中,因为btree索引是顺序排列的 **使用限制** 使用索引所命中的数据占了表大部分空间的时候,mysql查询优化器会认为使用全表扫描性能更好,实际就不使用索引 * 如果不是按照索引最左列开始查找,则无法使用索引 index(订单号,订单日期),只是使用订单日期,就无法使用联合索引 * 使用索引时不能跳过索引中的列,不是最左边的列 index(订单日期,下单人姓名,下单人电话), 使用只有订单日期和下单人电话是不行的,跳过了下单人姓名 * not in和<>操作无法使用索引 * 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引 * 对键值的大小是有限制的,innodb是不能超过767个字节,myisam是1千个字节 ## hash索引 * hash索引是基于hash表实现的,只有查询条件精确匹配hash索引中的所有列时,才能够使用到hash索引 * 对于hash索引中的所有列,存储引擎都会为每一行计算一个hash码,hash索引中存储的就是hash码 **使用限制** * hash索引必须进行二次查找 * hash索引无法用于排序 * hash索引不支持部分索引查找也不支持范围查找 * 不使用重复数据很多的列,比如性别列 * hash索引中hash码的计算可能存在hash冲突 # 索引优化 可以指定一个索引的大小 create index index_name on table(col_name(n)); 使用索引扫描来优化排序 * 索引的列顺序和order by子句的顺序完全一致 * 索引中所有列的方向(升序,降序)和order by子句完全一致 * order by中的字段全部在关联表中的第一张表中 # 安装演示数据库 ![](https://box.kancloud.cn/8b2081a2abbd495ac26c03d8a64d17a6_1224x452.jpg)