--MySQL 结构有两部分组成
1.MySQL server 层
2.存储引擎层
--注:到 存储引擎层之前都属于 MySQL server 层
MySQL 5.1到 5.7 ,大版本 没有变化 ,小版本 唯一的变化就是 存储引擎 ,MySQL server 层没有变过
在 MySQL 5.5之后 包括 5.5 ,默认的存储引擎都是 innodb (engine=innodb) ,但是 在 5.5之前的版本,默认的存储引擎是 myisam ,基于表的
所以 如果是 5.5之前的版本,创建表的时候 需要指定 engine=innodb ,否则创建出来的表 都是 myisam 存储引擎的
基本上 5.1之后就是 5.5了;期间都是一个跳板
MySQL组成部分:
1.连接池组件
2.管理服务和工具组件
3.SQL接口组件
4.查询分析器组件
5.优化器组件
6.缓冲组件
7.插件式存储引擎
8.物理文件
存储引擎是基于表的,不是基于数据库的
mysql 的核心就是存储引擎
MySQL 表存储引擎
MySQL 插拔式的存储引擎架构提供了一系列标准的管理和服务支持
存储引擎是基于表的,而不是基于数据库的
根据具体的应用选择合适的存储引擎
OLTP:在线联机事物系统,---读多写少,比如:电商,支持行级锁,支持外键
OLAP:在线联机分析系统,---这个接触的几率很小
各类存储引擎介绍
一、innodb 存储引擎
1.支持事务,面向在线事务处理(OLTP)方面应用,支持行级锁,支持外键
2.通过多版本并发控制MVCC来获得高并发性,并且实现了sql标准的四种隔离级别(默认 repeatable)
3.提供插入缓冲(insert buffer),二次写(double write) ,自适应哈希索引(ahi),预读(read ahead)
4.对于表中的数据的存储,innodb 采用 clustered ;每张表的存储都按照主键的顺序存放,如果没有显示的为表定义主键,
innodb 会为每一张行生产一个6字节的rowid,作为主键
1>支持事务,行级锁,支持外键
2>多版本并发控制(mvcc)来获得高并发性
3>sql 标准的四种隔离级别:可重复读、不可重复读、串行读、脏读
4>innodb 三大特性:insert buffer ,double write ,ahi
5>一定要为每一张新建的表指定主键,不要让系统自动创建
二、 Myisam 存储引擎
1.不支持事务,表锁,全文索引,对OLAP在线分析处理,操作速度快
2. Myisam 存储引擎表由 MYD 和 MYI 组成,myd用来存放数据文件,myi 用来存放索引文件
3.从 MySQL 5.0开始 MySQL默认支持 256T 单表数据
4.对于 Myisam 存储引擎表,MySQL数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,区别于使用LUR算法缓存数据的大部分数据库
1>不支持事务,表级锁,全文索引,对OLAP 在线分析系统,操作速度快
2>MYD 存放数据文件,MYI 存放索引文件
3>从 MySQL5.0 开始,MySQL 默认支持 256T单表数据
4>对于 myisam 存储引擎表,MySQL数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,区别于使用LUR算法缓存数据的大部分数据库
三、NDB 存储引擎
1.数据全部放在内存中,因此主键查找的速度极快,可以线性提高数据库性能,高可用,高性能集群系统
2.NDB的存储引擎的连接操作是在MySQL数据库层完成,而不是在存储引擎层完成,因此复杂的连接操作需要巨大的网络开销
MySQL cluster 采用的就是NDB 存储引擎,跳过存储引擎,直接调用数据,这个就是不选择MySQL cluster的原因(电商不会使用)
四、memory存储引擎
1.将表中的数据存放在内存,如果数据库重启或者发生崩溃,表中的数据全部丢失;适用于存储临时数据临时表,数据仓库中的维度表,
默认使用 hash 索引不是 B树索引
2.只支持表锁,并发性能差,不支持text和blob类型,存储变长字段varchar时,是按照定常字段char方式进行,浪费内存空间
--注:理解位一张内存表,一张临时表;并发性能差,会浪费内存空间
五、archive存储引擎,只支持insert和select查询;
六、federated存储引擎,不存放数据,只是指向一台远程MySQL数据库服务器上的表
七、maria存储引擎,缓存数据和索引文件,行锁,提供MVCC功能,支持事务和非事务安全的选项支持,
以及更好的BLOB字符类型处理性能
maria存储引擎,是mariadb 默认的存储引擎,和innodb 是一样的,MVCC(多版本并发控制)
---总结
innodb 三大特性:
插入缓冲(insert buffer);二次写(double write);自适应哈希索引(ahi)
clustered 聚集存储
在生产环境中,新建表必须指定创建主键,否则系统会生成 UID ,消耗系统性能
innodb的并发性强,因为有行级锁
myisam: MYD 存储数据文件; MYI 索引文件,只缓存索引 ,数据文件还是在磁盘上
innodb: ibd 所有的文件是放在一起的,数据和索引都缓存,所以innodb速度快
[root@rc-mysql mysql]# ll user.*
-rw-rw---- 1 mysql mysql 10684 Apr 28 2016 user.frm
-rw-rw---- 1 mysql mysql 7500 May 22 16:44 user.MYD
-rw-rw---- 1 mysql mysql 4096 May 22 16:44 user.MYI
frm 是表结构,在innodb和myisam 都是这个后缀
MYD Myisam 存储引擎的数据文件
MYI Myisam 存储因为的索引文件
innodb 存储引擎的后缀名 ibd ,数据和索引在一个文件里面
innodb表 数据就是索引,索引就是数据
---总结:
innodb和myisam 的区别
1.事务(innodb 支持,myisam 不支持)
2.锁粒度(innodb 行级锁 ,myisam表级锁 )
3.并发(innodb 支持多版本并发控制-MVCC ,获得高并发)
4.缓存文件(innodb 缓存数据和索引,myisam 只缓存索引,不缓存数据)
5.文件名后缀(innodb : ibd;myisam MYD MYI )
6.5.6以后包括5.6 都支持全文索引,但是不支持中文的(innodb 在 5.6 以前不支持全文索引)
----在5.5包括5.5,默认存储引擎都是innodb
----(engine=innodb),但是5.5之前的版本,存储引擎都是 myisam ,基于表的
7.innodb 执行 delete 的时候 是一行一行删除,因为有行级锁,并且不会将表删除
myisam 是删除整张表,然后在重新创建表结构一样的表
8.select count(*);
myisam 比 innodb 快,因为里面有一个计数器,当有数据进入的时候,计数器会进行统计而innodb 需要对表进行一次全表扫描
----问题点
1.MySQL不支持全文索引?
5.6开始支持全文索引,但是只能查询非中文的
2.MySQL快是因为不支持事务?
innodb 支持事务
3.当表大于一千万的时候,MySQL性能会急剧下降?
是;但是可以不让一张表大于一千万,分表;
或者涉及架构,比如百度架构(代理方式)