前言

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、FederatedMaria存储引擎等等

二、索引

2.1聚集索引和辅助索引

  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 都有)

  1. - 数据访问变得顺序,使用辅助索引时,根据查询结果,按照主键排序,顺序书签查找。
  2. - 减少缓冲池中页被替换的次数。
  3. - 批量处理对键值的查询操作。
  • 操作如下:
    • 查询的辅助索引存入缓存,根据辅助索引键值排序
    • 键值根据RowID进行排序
    • 更新RowID的排序顺序来访问实际的数据文件
  • RMM还可以将某些范围查询拆分成键值对,然后批量查询,拆分过程中同时过滤一些不符合查询条件的数据。

    2.6 IndexConditionPushdown(ICP) 优化

    mysql 5.6以后开始支持

    • 普通查询:进行索引查询,首先根据索引查找记录,根据where条件过滤。
    • ICP 优化,取出索引的同时,判断是否可以进行where条件过滤,减少上层对SQL对记录的索取,提高性能。

      三、哈希算法

      InnoDB 存储引擎,冲突解决使用链式,使用除法列散。缓冲池的Page页都有一个chain指针,指向相同哈希函数值的页,m去略大于2倍缓冲池页数数量的质数。
      自适应哈希索引,数据库自身创建使用的,范围查找是不能使用哈希索引的。且自适应哈希索引是由InnoDB存储引擎自己控制,默认开启。

      四、全文检索

      InnoDB1.2.x 前并不支持,MyISAM 存储引擎,需要对表进行拆分,并存储为MyISAM表