阿里索引规约:
- 90%查询使用单表查询,即尽量不要连表
- 超过三表 禁止join 并且 连表字段 必须加上索引
- 连表时 尽量使用 相同类型字段 去连表
- varchar字段必须指定索引长度,没必要对全字段建立索引
- 页面搜索 严禁使用 左右模糊 或者全模糊查询,如果需要,请使用搜索引擎
- order by 也需要遵循 索引最左匹配原则
- 利用索引覆盖,避免回表
- sql优化目标 至少达到range(范围检索),要求是ref(普通索引),最好是consts(唯一索引、主键)
- 建立组合索引,区分度高的放前面
- 例如:where c > ? and d = ? 那么d需要放在索引的最前列,组合索引idx_d_c
概念:帮助mysql高效获取数据的排好序的数据结构
数据结构:
- 二叉树
- 红黑树
- hash表
- B-Tree
红黑树:二叉平衡树 :纵向存储结构 查询效率较慢 可能一次查询 会从树的根节点链接很多次小查询
BTree
B+Tree 区别:
- 非叶子节点不存储data,只存储索引(冗余),因此可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点之间使用双向指针连接,提高区间访问性能
建议使用innoDB存储引擎(表引擎 而不是 库引擎)
innoDB主键索引 非主键索引区别:
innoDB:聚集索引 索引与数据 均在叶子节点
非主键索引叶子节点 存储 data和主键索引位置
因此innoDB引擎 数据表 一定要有主键 若没有 那么数据库会自动 选取一列数据隐藏添加唯一索引 如若也不存在此类数据 那么 数据库会生成隐藏列 类似于 rowId 作用依然类似主键索引
myisam:非聚集索引 索引与数据 分为两个文件
hash索引:
存储结构:位桶数组+链表
若索引key 在hash表中发生了hash碰撞 那么会不断链在后面
hash运算效率极高,如若不发生 hash碰撞 那么 近乎完美
致命缺点:不支持范围查找 因此工作几乎不用
联合索引(重要):
依据最左前缀法则去命中索引: 例如:联合索引(a,b,c),那么(ab)、(a)、(abc)会走索引
type字段为All,未使用索引;为ref,使用索引
ALL 全表扫描
index 索引全扫描
range 索引范围扫描,常用语<,<=,>=,between等操作
ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null MySQL不访问任何表或索引,直接返回结果
还有key字段表示用到的索引,没有用到为null
待续。。