先说一下存储引擎
MySQL5.1.X之前默认是MyISAM,从MySQL5.5.X开始,默认存储引擎为InnoDB Plugin
MyISAM
结构
每个MyISAM在磁盘上会将数据存储成三个文件,分别是:.frm文件存储表定义,.myd文件是数据文件,.myi文件是索引文件
特点
表级索、不支持事务支持全文索引
InnoDB
结构
.frm文件存储表定义,.idb文件存储数据和索引文件
特点
行级索、支持事务、不支持全文索引
如何选择
假如一个商城系统,在设计订单表和商品表时,如何选择引擎
订单表:一般后台操作,对事务要求高,查询少,用InnoDB
商品表:一般前台展示,查询多,用MyISAM
索引
常用索引类型一般为唯一性索引和普通索引,而索引方法有BTREE和HASH,常用BTREE,而不同引擎下对应的结构不同,那么其对应的索引也就不相同了
MyISAM下的索引
MyISAM引擎使用B+Tree作为索引结构,叶子节点的data域存放的是数据记录的地址,Col1为主键,上图是主索引的原理图
Col2建立的一个辅助索引,上图是基索引的原理图
MyISAM的这种索引方式叫做非聚集索引,即索引和数据分开放
InnoDB下的索引
InnoDB也使用B+Tree,但实现方式与MyISAM不同,InnoDB的数据文件本身就是索引文件,上图是Col1作为主键的主索引的原理图
InnoDB的辅助索引data域存储相应记录主键的值而不是地址,即InnoDB的所有辅助索引都引用主键作为data域,上图为col3的辅助索引
像InnoDB这样数据和索引都放在同一文件叫做聚集索引,这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录
关于聚集索引
- 默认拿主键作为聚集索引
- 如果没有主键,会去取非空唯一的索引作为聚集索引
- 如果上面都没有,Innodb自己去维护一个唯一索引
总结
优缺点
优点:
提高检索速度,降低IO、CPU消耗
缺点:
占空间,索引字段更新会有性能损耗
用索引
-
单表单库,出现查询性能瓶颈,大概在500万
-
排序字段
-
分组字段
不用索引
- 频繁更新的字段不适合建立索引
- where没有使用的字段
- 表的数据很少
- 数据重复且分布均衡的字段,如性别字段状态字段
- 参与列计算的时候不适合建立索引
优化思路
- 建索引
- sql解析
- 缓存
- 拆分(分库,分表(垂直,水平))
- scale out 水平扩展 增加机器 集群负载 (建议)
scale up 提高服务器性能,增加CPU,增加磁盘,SSD (很有钱的基础上面)