前言
mysql5.6
DML(Data Manipulation Language)数据操纵语言
DDL(Data Definition Language)数据定义语言
OLTP(on-line transaction processing): 增删改居多的应用
OLAP(On-Line Analytical Processing): 查询居多的应用。
5.6以后添加在线Online DDL和DML,将一段时间的DML,写入一个缓存,等表更新完成后再重新写入新的表,有个online_alter_long_max_size 大小限制。
一、引擎区别
1.1 InnoDB存储引擎
支持事务、行锁、 支持外键 (默认建立外键的时候会自动建立索引)、支持全文索引,5.5.8开始是MYSQL 的默认存储引擎,采用 聚集 的方式,所以表的存储都是按主键的顺序进行存放,如果没有显示定义主键,会自动生成一个6字节的ROWID,并以此作为主键。
1.2 MyISAM 存储引擎
不支持事务、表锁设计、支持全文索引。此前是MYSQL的默认引擎,缓存池只缓存索引文件,不缓冲数据文件。默认支持表大小为4GB,如果需要更大需要设置MAX_ROWS、AVG_ROW+LENGTH属性。5.0开始,默认支持256TB 的单表数据,
1.3 NDB
集群存储引擎,数据全部存放内存中,主键查找极快,但是连接操作,是在MYSQL数据库层完成,不是引擎层完成,连接需要巨大的网络开销,查询慢~。
1.4 其他引擎
Memory 、Archive、Federated、Maria存储引擎等等
二、索引
2.1聚集索引和辅助索引
**区别**:叶子节点存放是否是在一整行。
- 聚集索引
索引组织表,按照主键顺序存放,按照每张表的主键构建B+树,叶子节点中存放的即为整张表的行记 录,聚集索引的叶子节点称为数据页。每张表只有一个聚集索引。在物理上并不是连续的,而是在逻辑上连续。主键顺序查找和范围查找非常快。
- 辅助索引(非聚集索引)
辅助索引并不影响聚集索引的组织,所以可以有多个辅助索引存在。辅助索引,并不是包含行的信息,而是包括一个书签,告诉innoDB在哪里可以找到于索引相对应的行数据。
InnoDB只支持B+树索引,所以索引类型只是BTREE
添加索引的命令中:Collation,表明列使用什么方式存储在索引中,A,默认B+Tree排序保存;如果使用Heap存储并且建立Hash索引,那么就是NULL,根据Hash的桶存放索引数据。
最右匹配原则,新加的索引,其中有一个是主键或者某个索引的组成部分,只会给你添加另外一个索引(mysql 5.6+)
2.2 联合索引
多个字段一起构建起来的索引,常用的情况,where a= and b=,那么,(a,b) 可以使用联合索引。同时建立多个索引,优化器会自动选择较优的那个进行使用。
2.3 覆盖索引
InnoDB1.0、mysql5.0 下或一下不支持。直接通过辅助索引完成查询,例如:查询统计。
优化器并没有通过索引去查找数据,而是通过扫描聚集索引,全表扫描,多发生在范围查找、JOIN等操作情况。
2.4INDEX HINT
显性告诉优化器选择哪个索引,不建议新手使用。一般优化器使用非常有效和正确。
2.5 Multi-Range Reade(MRR) 优化
5.6版本开始,减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问,使用range、ref、eq_ref类型的查询。 (InnoDB、MyISAM 都有)
- 数据访问变得顺序,使用辅助索引时,根据查询结果,按照主键排序,顺序书签查找。- 减少缓冲池中页被替换的次数。- 批量处理对键值的查询操作。
