mysql索引

阿里索引规约:

  1. 90%查询使用单表查询,即尽量不要连表
  2. 超过三表 禁止join 并且 连表字段 必须加上索引
  3. 连表时 尽量使用 相同类型字段 去连表
  4. varchar字段必须指定索引长度,没必要对全字段建立索引
  5. 页面搜索 严禁使用 左右模糊 或者全模糊查询,如果需要,请使用搜索引擎
  6. order by 也需要遵循 索引最左匹配原则
  7. 利用索引覆盖,避免回表
  8. sql优化目标  至少达到range(范围检索),要求是ref(普通索引),最好是consts(唯一索引、主键)
  9. 建立组合索引,区分度高的放前面
    1. 例如: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

待续。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值