数据库引擎

数据库引擎以前只知道一点点大概的,最近又看了看。这里记录一下

1.数据库引擎

2.mysql默认的数据库引擎

3.innodb底层实现原理

4.oracle默认的存储架构

5.mysql数据库引擎相关操作


<!----分割线---->


1.数据库引擎


数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。可以使用 SQL Server Management Studio 管理数据库对象,使用 SQL Server Profiler 捕获服务器事件。

2.mysql默认数据库引擎



ISAM
是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。
ISAM的两个主要不足之处在于:它不支持事务处理,也不能够容错。如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序

MyISAM
提供ISAM里所没有的索引字段管理的大量功能
使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。
MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因。
不能在表损坏后恢复数据不支持事务,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。
存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。

InnoDB
提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。
该引擎还提供了行级锁外键约束,它的设计目标是处理大容量数据库系统,由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。
但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除

A 事务的原子性(Atomicity):指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.
C 事务的一致性(Consistency):指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.
I 独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.
D 持久性(Durability):事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚.

MyISAM和InnoDB比较
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快。
InnoDB提供了行级锁和外键约束。MyIASM不支持行级锁和外键。
InnoDB引擎不支持FULLTEXT类型的索引。
InnoDB没有保存表的行数,而MyIASM中存储了表的行数。执行count(*)操作时不同,如果后面有WHERE条件,则两种引擎扫描方式相同。
两种数据库引擎在索引上也有一些区别。

MyISAMInnoDB选择
大尺寸的数据集趋向于选择InnoDB引擎,因为它支持事务处理和故障恢复。主键查询在InnoDB引擎下也会相当快。大批的INSERT语句(在每个INSERT语句中写入多行,批量插入)在MyISAM下会快一些,但是UPDATE语句在InnoDB下则会更快一些,尤其是在并发量大的时候。
MyISAM适合:
(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:
(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建。

性能测试
所有的性能测试在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 内存的电脑上测试。
测试方法:连续提交10个query, 表记录总数:38万 , 时间单位 s
引擎类型MyISAMInnoDB 性能相差
count 0.00083573.01633609
查询主键 0.005708 0.157427.57
查询非主键 24.01 80.37 3.348
更新主键 0.008124 0.8183100.7
更新非主键 0.004141 0.02625 6.338
插入 0.004188 0.369488.21
(1)加了索引以后,对于MyISAM查询可以加快:4 206.09733倍,对InnoDB查询加快510.72921倍,同时对MyISAM更新速度减慢为原来的1/2,InnoDB的更新速度减慢为原来的1/30。要看情况决定是否要加索引,比如不查询的log表,不要做任何的索引。
(2)如果你的数据量是百万级别的,并且没有任何的事务处理,那么用MyISAM是性能最好的选择。
(3)InnoDB表的大小更加的大,用MyISAM可省很多的硬盘空间。

在我们测试的这个38w的表中,表占用空间的情况如下:

引擎类型MyISAM InnoDB
数据 53,924 KB 58,976 KB
索引 13,640 KB 21,072 KB

占用总空间 67,564 KB 80,048 KB

另外一个176W万记录的表, 表占用空间的情况如下:
引擎类型MyIsam InnorDB
数据 56,166 KB 90,736 KB
索引 67,103 KB 88,848 KB

占用总空间 123,269 KB179,584 KB

3.innodb底层实现原理



InnoDB数据页结构--页
页是InnoDB存储引擎管理数据库的最小磁盘单位。页类型为B-Tree node的页,存放的即是表中行的实际数据了。
InnoDB中的页大小为16KB,且不可以更改。
InnoDB可以将一条记录中的某些数据存储在真正的数据页面之外,即作为行溢出数据。MySQL的varchar数据类型可以存放65535个字节,但实际只能存储65532个。同时InnoDB是B+树结构的,因此每个页中至少应该有两个行记录,否则失去了B+树的意义,变成了链表,所以一行记录最大长度的阈值是8098,如果大于这个值就会将其存到溢出行中。

InnoDB数据页结构--页组成部分
File Header(文件头)
Page Header(页头)
Infimun + Supremum Records
User Records(用户记录,即行记录)
Free Space(空闲空间)
Page Directory(页目录)
File Trailer(文件结尾信息)

4.oracle默认的存储架构

oracle 使用2个引擎来执行SQL和代码块:SQL 引擎和PL/SQL 引擎, Oracle 使用这2个引擎来执行PL/SQL blocks 和 subprograms。那么在执行的时候,PL/SQL 引擎把DML 语句发送给SQL 引擎,然后由SQL 引擎执行,执行完毕后,SQL 引擎把结果集在发送给PL/SQL 引擎。因此在不同引擎之间切换就需要进行context switch,过多的context switch是会影响SQL性能的。而bulk 就是从减少引擎之间context switches的方式来提高sql的效率。 把对SQL 进行打包处理。

sql引擎
数据库引擎

查询优化器:
为语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,调用计划生成器(Plan Generator)生成计划,比较计划的代价,最终选择一个代价最小的执行计划(注意代价估算器只能估算出代价,并不能选择出最优的,来让计划生成器生成那个最优的,而是让计划生成器生成所有的执行计划,再进行比较)。

查询转换器:
决定是否重写用户的查询(包括视图合并,子查询反嵌套),以生成更好的查询计划。

代价估算器:
代价估算器使用统计数据来估算操作的选择率(selectivity)、返回数据集的势(Cardinality)和代价。并最终估算出整个执行计划的代价。

计划生成器:
计划生成器会考虑可能的访问路径(Access Path)、关联的方法和关联的顺序,生成不同的执行计划,让查询优化器从这些计划中选择代价最小的一个执行计划。

行源生成器:
行源生成器从查询优化器接收到优化的执行计划,然后为该计划生成行源(Row Source)。行源是一个可被迭代控制的结构体,它能以迭代方式处理一组数据行、并生成一组数据行。

sql执行引擎:
sql执行引擎依照语句的执行计划进行操作,产生查询结果。在每一个操作中,sql执行行引擎会以迭代的方式执行行源、生成数据行。

执行计划的生成:
当前实例内存中的执行计划,可以通过视图:v$sql_plan读取。

启用了awr时,oracle会将内存的执行计划存到历史数据中,我们可以通过查询sql语句,或者oracle提供的系统包dbms_xplan从历史数据中读取。
除了通过执行sql让oracle在内存中生成执行计划外,我们还可以通过命令Explain Plan让优化器仅对sql语句进行解释,生成执行计划,由于语句并不会真正执行,因此它可以含有没有赋值的绑定变量。执行explain plan命令后,oracle会将解释生成的查询计划插入表SYS.PLAN_TABLE$中。然后我们就可以通过查询语句或者包:dbms_xplan从该表中读取查询计划咯。注意:通过explain plan解释出来的查询计划不会被缓存到内存中,供语句执行时重用。

pl/sql引擎

数据库引擎

5.mysql数据库引擎相关操作

查看数据库支持的引擎和默认数据库引擎
show engines;

配置文件方式修改引擎
修改配置文件my-small.ini,在[mysqld]最后添加为上default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB

建表时指定引擎
create table mytbl(
id int primary key,
name varchar(50)
)type=MyISAM;

建表之后修改引擎
alter table mytbl2 type = InnoDB;