MySQL数据库
数据库知识
1.事务的四大特性
1.1四大特性
- 原子性
保持事务的原子性是指操作发生异常时,需要对该事务所有之前执行过的操作进行回滚。首先要设置autocommit=0,就是默认不能隐式提交,需要手动commit提交。回滚需要undo日志实现,undo日志存放之前修改过的记录,事务发生异常触发roll back,会按照日志逻辑回滚undo日志的操作。
- 一致性
一致性可以理解为事务对数据完整性约束的遵循。事务执行前后都是合法的数据状态,不会违背任何数据完整性
从数据库层面,数据库通过原子性、隔离性、持久性来保持一致性。
- 隔离性
用锁和隔离机制。锁是需要用户自己定义的,隔离机制是数据库提供的。
- 持久性
在无并发事务的情况下,持久性依赖于原子性;在有并发事务的情况下,持久性依赖于原子性和隔离性。
即使数据库系统遇到故障也不会丢失已提交事务的操作,通过redo日志来实现的。基本步骤如下图 :①当在事务中尝试对数据进行更改时;②首先将数据从磁盘读入内存,更新内存缓存的数据。③生成一条redo日志缓存,放在redo日志的缓冲区;④事务真正提交时将缓冲区中的日志写入redo日志做持久化保存;⑤把内存中的数据同步到磁盘上。
1.2隔离级别
在并发状态下,事务会出现一些问题,主要有三种问题:
脏读: 一个事务能读到另外一个事务没有提交的数据。(举例:A给B转了100块,但是A转完并没有提交该事务,B读到了自己的账户多了100块,此时A发现转账错误之后就回滚了该操作,此时就称为脏读)
不可重复读: 一个事务的两次查询操作数据不一致,可能是两次查询过程中插入了一个事务更新了原有的数据(举例:两个并发事务A和B,A首先查询自己的账户是100块,B此时提走了A账户的50块,A再次查询发现此时账户只剩下了50块,两次查询操作结果不同)
幻读: 在一个事务的两次查询中数据不一致,由于其他事务的提交,发现了原来没有的数据或者原有的数据不见了
(不可重复读与幻读相似,不可重复读侧重于另一个事务对数据库的修改操作,而幻读则侧重于另一个事务对数据库的增加和删除操作)
Ⅰ.读未提交
允许读取另一个事务尚未提交的数据,可能会造成脏读、不可重复读、幻读
Ⅱ.读已提交
允许读取并发事务已经提交了的数据,可以阻止脏读,但是不能避免不可重复读和幻读
Ⅲ.可重复读
在一个事务的操作过程中,不能读取到别的事务对该数据库的修改增删操作,可以阻止脏读和不可重复读,但是不能避免幻读(mysql默认级别)
Ⅳ.串行化
所有的事务依次逐个执行,当表被一个事务操作时,其他事务的操作不可以进行,进入排队状态,等待当前操作事务提交后才能继续执行操作。
1.3 锁
按使用方式分为乐观锁、悲观锁
乐观锁: 乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。
因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。
悲观锁: 悲观锁在操作数据时比较悲观,认为别人会同时修改数据。
因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。
锁如何实现?
悲观锁: 直接加锁,可以对代码加锁,如Java中的synchronized; 也可以对数据加锁,如select for update:给数据加上排他锁,直到事务提交或者回归才释放锁。
乐观锁:
(1)CAS(Compare And Swap)
3个操作数:需要读写的内存位置V,进行比较的预期值A,拟写入的新值B
操作逻辑:如果内存位置V的值等于预期的值A,则将该位置更新为新值B,否则不进行任何操作。许多CAS操作都是自旋的:如果操作不成功,会一直重试,直到操作成功为止。
CAS中的compare和swap两个操作,其原子性是在硬件层面进行保证的。
Java中的AtomicInteger 是一个原子类,利用CPU提供的CAS操作保证原子性。
(2)版本号机制
基本思路:在数据中增加一个字段version,表示该数据的版本号,每当数据被修改时,版本号加1。当某个线程查询数据时,将该数据的版本号一起查出来,当线程更新数据时,判断当前版本号与之前读取的版本号是否一致,如果一致才进行操作。
适用场景
功能限制:
**与悲观锁相比,乐观锁适用的场景受到了更多的限制。**CAS只能保证单变量操作的原子性;版本号机制:如果query的时候针对表1,而update的时候针对表2,很难通过版本号来实现乐观锁。
竞争激烈程度:
竞争不激烈时,乐观锁更有优势。 悲观锁会把代码或数据锁住,其他线程无法访问,影响并发性,而且加锁和释放锁都需要消耗额外的资源。
竞争激烈时,悲观锁更有优势,乐观锁在执行更新时频繁失败,需要不断重试,浪费CPU资源。
按粒度分为表级锁、行级锁、页级锁 (InnoDB支持行级锁、表锁,MyISAM只支持表锁)
锁的粒度越小,系统开销越大,但相应的并发性就越高。因此选择锁粒度的时候需要在系统开销和并发性间权衡。
锁的类型上划分为互斥锁/写锁/X锁、共享锁/读锁/S锁
2.索引
2.1 索引定义
索引能快速找到某一列中有一特定值的行。不必挨个儿去查看记录的内容。索引是对数据库中一列或者多列的值进行排序的一种数据结构,以索引文件的形式存储在磁盘上,占据一定的物理空间。
2.2 索引优点
- 提高查询的性能,大大减少表的检索行数
- 可以建立唯一索引或者主键索引,保证数据库中每一行数据的唯一性
- 加速表与表之间的连接
- 在使用分组group by和排序order by子句进行数据检索时,可以显著减少查询中分组和排序的时间(数据库的记录会重新排序)
2.3 索引缺点
1.索引文件占据物理空间(空间)
2.对表中数据进行增删改查时,索引也要动态地维护,降低了数据的维护速度(时间)
2.4 索引的分类
- 唯一索引: 数据列不允许重复但是允许为null,一个表允许多列创建多个唯一索引
- 主键索引: 数据列不允许重复,也不允许为null,一个表中只能有一个主键,但是可以有多个列共同组成的联合主键
- 普通索引: 没有唯一性的限制,允许为null,只是简单的加速查询
- 联合索引: 多个索引的组合,必须满足最左前缀原则
- 全文索引: 查找全文中的关键字, mysql的Innodb引擎不支持 myISAM引擎支持
2.5 索引设计原则
1.对查询频次较高、数据量较大的表建立索引
2.使用唯一索引,区分度越高,使用索引的效率越高
3.使用短索引,减少存储空间,提升I/O效率
4.利用最左前缀,在组合索引中比如有(name,city,age)的话,只支持(name)、(name,city)、(name,city,age)这三种组合的检索,查询时必须包含索引的最左列,不能跳过某个字段进行查询
5.为经常需要排序 分组和联合操作的字段建立索引
6.限制索引的数目,索引并非越多越好
2.6 索引失效的场景
-
复合索引不满足最左前缀原则
-
模糊查找时like ‘%'以%开头
-
where索引列有运算
-
where索引列有函数
-
mysql估计用全表扫描要比用索引更快,则不使用索引
-
查询条件中有or的话可能会造成索引失效,除非or的每个列都加上索引
2.7 不推荐使用索引的场景
-
数据唯一性比较差,重复比较多的情况下不要使用索引
-
频繁更新的字段不适用索引(导致索引维护困难)
2.8 索引的数据结构
1.B树(非二叉树)
1.关键字集合分布在整颗树中;
2.任何一个关键字出现且只出现在一个结点中;
3.搜索有可能在非叶子结点结束;
4.其搜索性能等价于在关键字全集内做一次二分查找,查找复杂度为h*log(n);
5.自动层次控制;
优点:层级结构较低,且冗余节点较少
2.B+树
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4.更适合文件索引系统;
支持翻页:每个磁盘块存储一个节点,称为一页。连续查询多个节点则称为翻页
B树和B+树的区别
(1)B+树中只有叶子节点会带有指向记录的指针,而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。
(2)B+树中所有叶子节点都是通过指针连接在一起,而B树不会。
- B+Tree对比BTree的优点
(1)磁盘读写代价更低。B+树非叶子节点不会带上指向记录的指针,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。搜索速度快
(2)查询速度更稳定,由于B+Tree非叶子节点不存储数据(data),因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的,均衡的。
(3)所有数据均有序存储在叶子节点,叶子节点之间通过指针来连接,使得范围查找、排序查找、去重查找变得简单易行(B树数据分布在各个节点,包括非叶子节点,不便于范围等查找,需要中序遍历)
(4)B+树只要遍历叶子节点就可以实现整棵树的遍历,而其他的树形结构 要中序遍历才可以访问所有的数据。
(4)缺陷:因为有冗余节点数据,因此会造成内存的浪费。
3.红黑树的规则:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点。
为什么平衡树和红黑树的区别是什么?为什么有了平衡树还要设计出来红黑树?
平衡树(AVL)更平衡,结构上更加直观,时间效能针对读取而言更高,但是维护起来比较麻烦!!!(插入和删除之后,都需要rebalance)。但是,红黑树通过它规则的设定,确保了插入和删除的最坏的时间复杂度是O(log N) 。
设计红黑树的目的,就是解决平衡树的维护起来比较麻烦的问题,红黑树,读取略逊于AVL,维护强于AVL,每次插入和删除的平均旋转次数应该是远小于平衡树。
红黑树 和 b+树的用途有什么区别?
(1)红黑树多用在内部排序,即全放在内存中的,STL的map和set的内部实现就是红黑树。
(2)B+树多用于外存上时,B+也被成为一个磁盘友好的数据结构。
4.hash哈希索引
特点:
1.hash表是key-value形式,通过一个散列函数,能够根据key快速找到对应的value
2.检索时无需使用树状结构那样从根节点到叶子节点逐级查找,只需要一次hash算法即可定位到相应位置,速度较快。
hash索引的缺点
1.hash索引只能够进行单值查找,不支持范围查询,而B+树支持范围查询(hash函数过滤后的键值大小关系不能保证和源数据的大小关系一致)
2.hash索引不能利用索引完成排序,以及像like 'xxx%'这样的模糊查询(本质上也是一种范围查询)
3.hash索引不支持多列联合索引的最左匹配原则
4.hash索引在重复值较高的时候,因为存在哈希碰撞导致性能极低。
5.hash索引只适用于存储数据重复度很低、对数据等值查询、无排序和范围查询的情况,效率较高。、
2.9索引的实现原理?
索引底层采用的数据结构是:B + Tree
通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。
select ename from emp where ename = ‘SMITH’;
通过索引转换为:
select ename from emp where 物理地址 = 0x3;
索引用来快速地寻找那些具有特定值的记录,如果没有索引,一般来说执行查询时会遍历整张表。
索引原理:
- 把创建了索引的列的内容进行排序;
- 对排序结果生成倒叙表;
- 在倒叙表内容上拼上数据地址链;
- 在查询时,先拿到倒叙表内容,再取出数据地址链,从而拿到具体数据。
3.delete drop truncate区别
DML 数据操纵语言(insert、update、delete)
DQL 数据查询语言(select from where)
DDL 数据定义语言(create 表/视图/索引) 是隐性提交的 不能roll back
DCL 数据控制语言(grant授权 roll back commit)
1.delete是DML,数据操纵语言,执行delete时每次从表中删除一行,删除操作会被记录在redo和undo表中以便进行回滚
2.drop是DDL,数据定义语言,会隐式提交,不能回滚,不会触发触发器,会删除表结构以及所有的数据,并将占用的空间全部释放
3.truncate是DDL,会隐式提交,不能回滚,不会触发触发器,会删除表内的所有数据,但是会保留表结构,即留下一个新表。
DML和DDL的区别
1.DML数据操纵语言,手动控制开启事务、提交事务和回滚
2.DDL数据定义语言,隐形提交,不能回滚
4.连接
连接用于连接多个表,使用join关键字,条件语句使用on而非where。查询效率快于子查询
与外键的区别是,允许两个表内各有部分项不相关(外键中子表中出现的字段父表中必须出现过,但是连接的两个表每个都可以有部分字段与另一个表没有联系)
1.内连接
等值连接
非等值连接
自连接
没有关联的行在查询结果中不显示
查询两个表的交集
2.外连接
保留了没有关联的行
左连接 保留左边表没有关联的行
右连接 保留右边表没有关联的行
全外连接 保留左边和右边两个表没有关联的行
5.where having on的区别
where和having区别
①where先筛选结果再用分组函数(如果有的话)计算,
having则是在分组函数计算结果出来之后再进行筛选,查询结果返回符合条件的分组,
where是在group by之前执行的,所以where后面不能使用分组函数进行数据过滤,只能使用该表内的字段进行过滤,筛选出过滤后的结果之后才能使用分组函数;having则是在group by之后执行,是从分组结果中用分组函数进行分组的过滤。
where性能优于having
②where优先级高于having,where既可以搭配select子句使用,也可以和group by搭配使用;having只可以搭配group by 语句使用。
on和where区别
所有查询操作都会返回一个临时表,查询结果从临时表中得到
①on是根据限制条件对数据库记录进行过滤,然后产生临时表,一般用于连接(内外连接);where则是在临时表产生后根据限制条件从临时表中筛选数据。
②on限制条件发生时间较早,临时表较小,所以性能优于where
6.查询速度慢如何解决
慢查询日志 用于记录响应时间超过阈值的语句,实际时记录运行时间10s以上的语句
首先分两种情况:
①大多数情况正常,偶尔很慢
1.数据库在刷新脏页
因为redo log的容量有限,如果redo log写满了之后需要暂停其他操作,把redo日志里的数据同步到磁盘,导致正常sql语句执行很慢
2.所访问的数据表被加锁
如果该表被加锁或者要使用到的表中的某一行被加锁,也会导致慢查询
②针对一直都很慢的情况
1.可能表中并没有索引,或者没有用到索引(比如使用like关键字时like ‘%xx’ 这种%位于匹配字符的第一个字符时,索引就不会起作用;或者多列索引不遵循最左前缀的原则 尽量使用唯一索引或者主键索引等区分度较大的索引;对查询操作较为频繁的列建立索引)
2.优化数据库结构
对于需要经常联合查询的表,可以建立中间表以提高查询效率。将原来的联合查询改为对中间表的查询。
3.分解关联查询
将一个大的查询分解为多个小查询,对每一个表做一次单表查询,将查询结果在应用程序中进行关联。
7.数据库数据量很大时,怎么加快查询速度?
(1)合理使用索引。
(2)避免或简化排序
(3)消除对大型表行数据的顺序存取
(4)避免相关子查询
(5)避免困难的正规表达式
(6)使用临时表加速查询
(7)用排序来取代非顺序存取
sql语句优化的方式:
1.尽量少 join
2.尽量少排序
3.尽量避免 select *
4.尽量少 or
5.尽量用 union all 代替 union
8.数据库的三大范式
第一范式 1NF
数据表中所有字段都是不可分割的原子值,字段值还可以继续拆分的就不满足第一范式
第二范式 2NF
在满足第一范式的前提下,除主键外得每一列,都必须完全依赖于主键,称之为满足第二范式。
第三范式 3NF
必须在满足第二范式、第一范式的前提下,除开主键列的其他列之间不能有传递依赖关系。
9.表的数据结构
表中数据结构的区别
int(10) char(10) varchar(10)的区别
(1)int(10)中10表示显示的数据的长度,而不是存储数据的大小,char(10)和varchar(10)的10表示存储数据的大小,即表示存储了多少个字符
(2)char(10)表示存储定长的10个字符,不足的部分用空格补齐(空格表示占位、不算一个字符),占用更多存储空间;
(3)varchar(10)表示存储10个变长的字符,无需补0以达到10字符,空格也按照存储空间存放。
10.慢查询
定义:超过指定时间的SQL语句查询称为“慢查询”。超过 long_query_time 参数设定的时间阈值(默认10s),慢查询被记录在慢查询日志里。
慢查询配置:
开启慢查询日志:set global slow_query_log = 1;
指定记录慢查询日志SQL执行时间得阈值(单位:秒,默认10秒)long_query_time:set global long_query_time=2;
慢查询分析工具:快速定位到需要优化的SQL语句
mysqldumpslow
pt_query_digest
11.MySQL主从复制
1、什么是mysql的主从复制?
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
2、mysql复制原理
原理:
(1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
也就是:
- 从库会生成两个线程,一个I/O线程,一个SQL线程;
- I/O线程会去请求主库的binlog(二进制日志),并将得到的binlog写到本地的relay-log(中继日志)文件中;
- 主库会生成一个log dump线程,用来给从库I/O线程传binlog;
- SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
12.常考的查询语句
(1)找出a表的第100行后的50个数据:
#查询从i+1开始的n条数据,limit n 等同于 limit 0,n
select * from tableName limit i,n
#具体的例子
select * from a where a limit 99,50
(2)创建新表,并插入
--新建学生表
create table Student (
name Int Not Null UNIQUE AUTO_INCREMENT Primary key,--添加了索引
Name varchar(20) not null,
age int null,
gender varchar(4) null );
----插入不存在的数据
insert into student (name,age,gender) value ('andy',30,'女');
(3)查询语句
--查询指定列
select name,age from student where id>10;
select sum(age) from student;
--只显示结果不同的项
select distinct age from student;
--使用算数表达式
select name,sal*13 as sal_all from emp;
--使用like,in运算符号
--%匹配一个或多个字符,_匹配一个字符
select * from emp where name like 'S_T%' or age >50;
select * from emp where job in ('clerk','analyst');
--为空或非空
select * from emp where sal is null;--is not null;
--排序
select * from emp order by deptno asc,sal desc; --asc升序
--例子:
select * from student where id>10
group by age having avg(age)>20
order by id desc;
select * from emp where sal = (select max(sal) from emp);
(4)多表查询
select e.name,e.sal,d.dname from emp e,dept d where e.deptno = d.deptno order by d.deptno;
--自连接
SELECT er.ename, ee.ename mgr_name from emp er, emp ee where er.mgr=ee.empno;
--嵌套查询
SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH');
--any(比任何一个都) 和all(比所有都)
SELECT ename,sal,deptno FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE deptno=30);
--SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MIN(sal) FROM emp WHERE deptno=30);
--多列子查询
SELECT * FROM emp where (job,deptno) = (select job,deptno from emp where name = 'Bob');
--更新数据
UPDATE emp SET(job, sal, comm)=(SELECT job, sal, comm FROM emp where ename='SMITH') WHERE ename='SCOTT';
-- 外连接(outer join):如果数据不存在,也会出现在连接结果中。
-- 左外连接 left join 如果数据不存在,左表记录会出现,而右表为null填充
-- 右外连接 right join 如果数据不存在,右表记录会出现,而左表为null填充
SELECT er.ename, ee.ename mgr_name from emp er left join emp ee where er.mgr=ee.empno;
这部分转自常用常考sql语句总结
13.MySQL的存储引擎及其区别
1.存储引擎是什么?
Mysql中的数据用各种不同的技术储存在文件(或内存)中,这些技术中的每一个技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力.在MySQL中将这些不同的技术及配套的相关功能称为存储引擎.
2.存储引擎有什么作用?
存储引擎其实就是对于数据库文件的一种存取机制,如何实现存储数据,如何为储存的数据建立索引以及如何更新,查询数据等技术实现的方法。存储引擎是用来把数据存储在文件或内存的技术
3.mysql存储引擎总共有九种,常用的数据引擎有MyISAM,InnDB,MEMORY,ARCHIVE;
(查看mysql支持引擎命令:SHOW ENGINES;对于MySQL 5.5及更高版本,默认的存储引擎是InnoDB。在5.5版本之前,MySQL的默认存储引擎是MyISAM。)
四种引擎的区别:
InnoDB: 支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
MyISAM: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archiv
注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。
InnoDB存储引擎
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎。InnoDB主要特性有:
1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合
2、InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的
3、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上
4、InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
5、InnoDB被用在众多需要高性能的大型数据库站点上
InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件
MyISAM存储引擎
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。MyISAM主要特性有:
1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持
2、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成
3、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
4、最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
5、BLOB和TEXT列可以被索引
6、NULL被允许在索引的列中,这个值占每个键的0~1个字节
7、所有数字键值以高字节优先被存储以允许一个更高的索引压缩
8、每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快
9、可以把数据文件和索引文件放在不同目录
10、每个字符列可以有不同的字符集
11、有VARCHAR的表可以固定或动态记录长度
12、VARCHAR和CHAR列可以多达64KB
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
MEMORY存储引擎
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。MEMORY主要特性有:
1、MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
2、MEMORY存储引擎执行HASH和BTREE缩影
3、可以在一个MEMORY表中有非唯一键值
4、MEMORY表使用一个固定的记录长度格式
5、MEMORY不支持BLOB或TEXT列
6、MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
7、MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)
8、MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享
9、当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)
ARCHIVE存储引擎
该存储引擎非常适合存储大量独立的、作为历史记录的数据。区别于InnoDB和MyISAM这两种引擎,ARCHIVE提供了压缩功能,拥有高效的插入速度,但是这种引擎不支持索引,所以查询性能较差一些。