mysql服务器主要分为3部分
1. 客户端: 主要处理 客户端连接、授权、安全等
2. 服务架构: 包括解析、分析、优化、缓存、内置函数、自实现(Procedure、Function、View、Index、Trigger)
3.存储引擎: 负责数据的存储、提取
sql优化主要集中在服务架构, 存储在于存储引擎
mysql 5.6支持的引擎
MyIsam 存储引擎独立于操作系统,也就是可以在windows上使用,也可以比较简单的将数据转移到linux操作系统上去。
这种存储引擎在创建表的时候,会创建三个文件,
一个是.frm文件用于存储表的定义,最新版本使用sdi文件存储表结构,格式为json
一个是.MYD文件用于存储表的数据,
另一个是.MYI文件,存储的是索引。
操作系统对大文件的操作是比较慢的,这样将表分为三个文件,那么.MYD这个文件单独来存放数据自然可以优化数据库的查询等操作。
1. 不支持事务,但是并不代表着有事务操作的项目不能用MyIsam存储引擎,可以在service层进行根据自己的业务需求进行相应的控制。 2. 不支持外键。 3. 查询速度很快。如果数据库insert和update的操作比较多的话采用表锁效率低(建议使用innodb)。 4. 对表进行加锁。
Merge存储引擎,是一组MyIsam的组合,也就是说,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作。
可以直接从数据表里面操作, 也可以直接在mrg表里面, 删除mrg表, 不会影响实际表的数据。
Memory采用的逻辑介质是内存,响应速度应该是很快的,但是当mysqld守护进程崩溃的时候数据会丢失,另外,要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。
每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。
MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。
“黑洞”存储引擎,他会丢弃所有的插入的数据,服务器会记录下Blackhole表的日志,所以可以用于复制数据到备份数据库。可以用来充当dummy master,利用blackHole充当一个“dummy master”来减轻master的负载,对于master来说“dummy master” 还是一个slave的角色,还有充当日志服务器等等。
1. BLACKHOLE支持所有类型的索引 2. BLACKHOLE 表不存储数据,如果复制基于SBR,语句可以记录并在从库执行;如果复制为RBR、MBR,UPDATE及DELETE操作将会跳过,不会记录也从库不执行。 3. Insert触发器可以正常使用,Update、Delete触发器因为不存储数据不能触发,FOR EACH ROW 也不能触发。 4. BLACKHOLE 表Auto Increment字段不会自动递增,也不保留自增字段的状态 5. 结合复制replicate-do和replicate-ignore规则,可使用BLACKHOLE当做一个分发主服务器 6. 可用来验证转储文件语法 7. 测试binlog的开销量,通过对比 BLACKHOLE 与 不启动 binlog的性能 8. 可能被用来查找与存储引擎自身不相关的性能瓶颈
可以将scv文件作为MySql的表来使用,但是不支持索引。CSV引擎表所有的字段都必须为非空的,创建的表有两个一个是CSV文件和CSM文件。
MySQL5.5以后新增了一个存储引擎,就是Performance_Schema,他主要是用来收集数据库服务器的性能参数。MySQL用户不能创建存储该类型的表。
他提供了以下的功能: 1. 提供进程等待的详细信息,包括锁、互斥变量、文件信息。 2. 保存历史的事件汇总信息,为Mysql服务器的性能做出详细的判断。 3. 对于新增和删除监控时间点都非常容易,并可以随意的改变Mysql服务器的监控周期
需要在配置文件my.cnf中进行配置才能开启。
archive是归档的意思,仅仅支持插入和查询两种功能,在MySQL5.5以后支持索引功能,他拥有很好的压缩机制,使用zlib压缩库,在记录请求的时候实时的进行压缩,经常被用来作为仓库使用。适合存储大量的独立的作为历史记录的数据。拥有很高的插入速度但是对查询的支持较差。
Federated存储引擎是访问MySQL服务器的一个代理,尽管该引擎看起来提供了一个很好的跨服务器的灵活性,但是经常带来问题,默认是禁用的。
FEDERATED是其中一个专门针对远程数据库的实现。一般情况下在本地数据库中建表会在数据库目录中生成相应的表定义文件,并同时生成相应的数据文件。但通过FEDERATED引擎创建的表只是在本地有表定义文件,数据文件则存在于远程数据库中。
Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
innodb表结构定义文件以frm结尾,这个配置和存储引擎无关。表的定义在 definition cache 中缓存frm文件,通过table_definition_cache 可以设置cache的大小。
若将innodb_file_per_table设置为on(独占表空间文件), 则每个表将独立地产生一个表空间文件,以ibd结尾,包含数据、索引、表的内部数据字典信息都将保存在这个单独的表空间文件中。 若将innodb_file_per_table设置为off(共享表空间文件), 则依据innodb_data_file_path存储, 可以修改,默认表空间文件是ibdata1(主要存储的是共享表空间数据),初始化为10M,且可以扩展。
InnoDB是一个事务型的存储引擎,有行级锁定和外键约束,适用于以下的场合:
1. 更新多的表,适合处理多重并发的更新请求。 2. 支持事务。 3. 可以从灾难中恢复(通过bin-log日志等)。 4. 外键约束。只有他支持外键。 5. 支持自动增加列属性auto_increment。
// 部分参考来自于网络, 如有侵权,请联系删除