MySQL索引小记

先说一下存储引擎

MySQL5.1.X之前默认是MyISAM,从MySQL5.5.X开始,默认存储引擎为InnoDB Plugin

MyISAM

结构

每个MyISAM在磁盘上会将数据存储成三个文件,分别是:.frm文件存储表定义,.myd文件是数据文件,.myi文件是索引文件

特点

表级索、不支持事务支持全文索引

InnoDB

结构

.frm文件存储表定义,.idb文件存储数据和索引文件

特点

行级索、支持事务、不支持全文索引

如何选择

假如一个商城系统,在设计订单表和商品表时,如何选择引擎

订单表:一般后台操作,对事务要求高,查询少,用InnoDB

商品表:一般前台展示,查询多,用MyISAM

索引

常用索引类型一般为唯一性索引和普通索引,而索引方法有BTREE和HASH,常用BTREE,而不同引擎下对应的结构不同,那么其对应的索引也就不相同了

MyISAM下的索引

MySQL索引小记_第1张图片
mysql_myisam01.png

MyISAM引擎使用B+Tree作为索引结构,叶子节点的data域存放的是数据记录的地址,Col1为主键,上图是主索引的原理图

MySQL索引小记_第2张图片
mysql_myisam02.png

Col2建立的一个辅助索引,上图是基索引的原理图
MyISAM的这种索引方式叫做非聚集索引,即索引和数据分开放

InnoDB下的索引

MySQL索引小记_第3张图片
mysql_innodb01.png

InnoDB也使用B+Tree,但实现方式与MyISAM不同,InnoDB的数据文件本身就是索引文件,上图是Col1作为主键的主索引的原理图

MySQL索引小记_第4张图片
mysql_innodb02.png

InnoDB的辅助索引data域存储相应记录主键的值而不是地址,即InnoDB的所有辅助索引都引用主键作为data域,上图为col3的辅助索引
像InnoDB这样数据和索引都放在同一文件叫做聚集索引,这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录

关于聚集索引

  1. 默认拿主键作为聚集索引
  2. 如果没有主键,会去取非空唯一的索引作为聚集索引
  3. 如果上面都没有,Innodb自己去维护一个唯一索引

总结

优缺点

优点:
提高检索速度,降低IO、CPU消耗
缺点:
占空间,索引字段更新会有性能损耗

用索引

  1. 单表单库,出现查询性能瓶颈,大概在500万
  1. 排序字段
  1. 分组字段

不用索引

  1. 频繁更新的字段不适合建立索引
  2. where没有使用的字段
  3. 表的数据很少
  4. 数据重复且分布均衡的字段,如性别字段状态字段
  5. 参与列计算的时候不适合建立索引

优化思路

  1. 建索引
  2. sql解析
  3. 缓存
  4. 拆分(分库,分表(垂直,水平))
  5. scale out 水平扩展 增加机器 集群负载 (建议)
    scale up 提高服务器性能,增加CPU,增加磁盘,SSD (很有钱的基础上面)

扩展阅读

  1. MySQL索引背后的数据结构及算法原理
  2. B+/-Tree原理及mysql的索引分析

你可能感兴趣的:(MySQL索引小记)