[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)
- SQL
- 名词
- mysql
- 初识mysql
- 备份和恢复
- 存储引擎
- 数据表损坏和修复
- mysql工具
- 数据库操作
- 增
- 删
- 改
- 查
- 数据类型
- 整数类型
- 小数类型
- 日期时间类型
- 字符和文本型
- enum类型
- set类型
- 时间类型
- null与not null和null与空值''的区别
- 数据表操作
- 创建
- 索引
- 约束
- 表选项列表
- 表的其他语句
- 视图
- sql增删改查
- sql增
- sql删
- sql改
- sql查
- sql语句练习
- 连接查询和更新
- 常用sql语句集锦
- 函数
- 字符函数
- 数值运算符
- 比较运算符与函数
- 日期时间函数
- 信息函数
- 聚合函数
- 加密函数
- null函数
- 用户权限管理
- 用户管理
- 权限管理
- pdo
- 与pdo相关的几个类
- 连接数据库
- 使用
- pdo的错误处理
- pdo结果集对象
- pdo结果集对象常用方法
- pdo预处理
- 常用属性
- mysql编程
- 事务
- 语句块
- mysql中的变量
- 存储函数
- 存储过程
- 触发器
- mysql优化
- 存储引擎
- 字段类型
- 三范式和逆范式
- 索引
- 查询缓存
- limit分页优化
- 分区
- 介绍
- 分区算法
- list分区
- range范围
- Hash哈希
- key键值
- 分区管理
- 特别注意
- 分表
- 数据碎片与维护
- innodb表压缩
- 慢查询
- explain执行计划
- count和max,groupby优化
- 子查询优化
- mysql锁机制
- 介绍
- 演示
- 总结
- 乐观锁和悲观锁
- 扛得住的mysql
- 实例和故事
- 系统参数优化
- mysql体系结构
- mysql基准测试
- 索引
- mysql的复制
- win配置MySQL主从
- mysql5.7新特性
- 常见问题
- general log
- 忘记密码
- uodo log与redo log
- 事务隔离级别
- mysql8密码登录
- explain
- 高效的Tree表
- on delete cascade 总结
- mongod
- 简介
- 集合文档操作语句
- 增删改查
- 索引
- 数据导入和导出
- 主从复制
- php7操作mongod
- 权限管理
- redis
- redis简介
- 3.2版本配置文件
- 3.0版本配置文件
- 2.8版本配置文件
- 配置文件总结
- 外网连接
- 持久化
- RDB备份方式保存数据
- AOF备份方式保存数据
- 总结
- win安装redis和sentinel部署
- 事务
- Sentinel模式配置
- 分布式锁
- 管道
- php中redis代码
- 发布订阅
- slowlog
- Redis4.0
- scan和keys
- elasticsearch
- 配置说明
- 启动
- kibana
- kibana下载
- kibana配置文件
- kibana常用功能
- 常用术语
- Beats
- Beats简介
- Filebeat
- Packetbeat
- Logstash
- 配置
- elasticsearch架构
- es1.7
- head和bigdesk插件
- 插件大全
- 倒排索引
- 单模式下API增删改查
- mget获取多个文档
- 批量操作bulk
- 版本控制
- Mapping映射
- 基本查询
- Filter过滤
- 组合查询
- es配置文件
- es集群优化和管理
- logstash
- kibana
- es5.2
- 安装
- 冲突处理
- 数据备份
- 缺陷不足
- 集群管理api
- 分布式事务
- CAP理论
- BASE模型
- 两阶段提交(2PC)
- TCC (Try-Confirm-Cancle)
- 异步确保型
- 最大努力通知型
- 总结