概念
1.存储引擎其实就是如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。
2.MySQL中的数据用各种不同的技术存储在文件(或内存)中,这些技术中的每一种技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力。在MySQL中将这些不同的技术及配套的相关功能称为存储引擎。
查看数据库存储引擎
1.show engines
//查看MySQL支持的存储引擎
2.show variables like '% storage_engine'
//查看默认支持的存储引擎
3.show create table tablename
//查看某个表使用的存储引擎
4.show table status from database where name="tablename"
// 查看某个数据库中某个数据表存储引擎
常用存储引擎的特点
MySQL中常用的几种存储引擎:MyISAM、InnoDB、bdb、MEMORY
,对比如下:
MyISAM存储引擎:
MyISAM 这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁
,主要用于高负载的select
。所以其写入的并发处理能力相对较弱。
MyISAM类型的数据表(.MYD文件)支持三种不同的存储结构:静态型、动态型、压缩型。
静态型:就是定义的表列的大小是固定(即不含有:xblob、xtext、varchar等长度可变的数据类型),这样mysql就会自动使用静态myisam格式。
使用静态格式的表的性能比较高,因为在维护和访问的时候以预定格式存储数据时需要的开销很低。但是这高性能是有空间换来的,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。
动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar
等数据类型),这时myisam
就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,因为如果某个字段的内容发生改变则其位置很可能需要移动,这样就会导致碎片的产生。随着数据变化的怎多,碎片就会增加,数据访问性能就会相应的降低。
对于因为碎片的原因而降低数据访问性,有两种解决办法:
1.尽可能使用静态数据类型
2.经常使用optimize table
语句,他会整理表的碎片,恢复由于表的更新和删除导致的空间丢失。
(如果存储引擎不支持 optimize table
则可以转储并重新加载数据,这样也可以减少碎片)
压缩型:如果在这个数据库中创建的是在整个生命周期内只读的表,则这种情况就是用myisam的压缩型表来减少空间的占用。
支持的索引类型有:B-Tree,R-Tree,Full-Text
索引
COUNT()问题——MyISAM存储引擎记录表行数,所以在使用COUNT(*)时,只需取出存储的行数,而不用遍历表,效率较高。
myisam会创建三个文件夹:
1.xxx(表名).frm –>表结构
2.xxx(表名).myi –>索引
3.xxx(表名).myd –>数据文件
innoDB存储引擎:
同MyISAM一样的是,InnoDB存储引擎也有.frm文件存储表结构定义
innodb存储引擎该mysql表提供了事务,回滚以及系统崩溃修复能力和多版本并发
控制的事务的安全。
InnoDB有支持事务及安全的日志文件,这个文件非常重要,InnoDB可以通过日志文件将数据库崩溃时已经完成但还没来得及将内存中已经修改但未完全写入磁盘的数据写入磁盘,也可以把已部分完成并写入磁盘的未完成事务回滚,保证数据一致性。如果错误删除日志文件会导致数据库崩溃且无法启动。
innodb支持自增长列(auto_increment),自增长列的值不能为空,如果在使用的时候为空的话就会进行自动存现有的值开始增值,如果有但是比现在的还大,则就保存这个值。
innodb存储引擎支持外键(foreign key) ,外键所在的表称为子表而所依赖的表称为父表。
innodb
存储引擎支持MVCC
的行级锁,为承受高并发增加了竞争力。
增删改查性能——如果执行大量的增删改操作,推荐使用InnoDB存储引擎,它在删除操作时是对行删除,不会重建表。
COUNT(*)
问题——InnoDB
存储引擎会遍历表以计算数量,效率较低。