首页 > 代码库 > mysql常识以及存储引擎,锁和事务

mysql常识以及存储引擎,锁和事务

常见的数据库系统:

1、甲骨文的Oracle

2IBMDB2

3、微软的Access SQL Server

4、开源PostgreSQL

5、开源MySQL 


mysql数据库三阶段

初期开源数据库阶段

sun mysql阶段

oracle mysql阶段


OLTP:联机事务处理,面向基本的、日常的事务处理。

OLAP:联机分析处理,数据仓库的主要应用。

mysql分支版本(一些):

MariaDB : Maria引擎室myisam存储引擎的升级版本,增加了对Hash join的支持和Semi Join的优化,提高了查询性能,适合OLAP。

Drizzle:适合云计算组件和web应用的数据库,高并发,高效的内存使用,开放源码。

InnoSQL:1、InnoDB Flash Cache:将SSD作为Flash Cache  2、InnoDB Share Memory :将Share Memory作为InnoDB的共享内存,以此提高数据库的预热。3、IO Statistics:扩展了mysql原有的Slow log 的内容,现在可记录某SQL语句的逻辑读取和物理读取的IO


存储引擎(表类型):

InnoDB存储引擎:支持事务、回滚,主要面向OLTP,支持行锁设计、支持外键、支持类似Oracle的非锁定读。(mysql 5.5.8开始是默认存储引擎)数据放在一个独立的表空间、使用MVCC(多版本并发控制)、实现4种隔离级别,默认REPEATABLE级别、使用netx-key locking避免幻读,还有插入缓冲、二次写、自适应哈希索引、预读等。采用聚集的方式,每张表都按主键的顺序进行存储。索引和数据是紧密捆绑的,没有使用压缩从而会造成INNODB比MYISAM体积庞大不小。

 使用场合:在承载的大部分项目执行insert 和update的话,应该选择InnoDB.

优势:在于提供了良好的事务管理、崩溃、修复能力和并发控制,

缺点:是其读写效率稍差,占用的数据空间相对比较大.


Myisam存储引擎:不支持事务,表锁设计,支持全文索引,主要面向OLAP,在innodb以前是默认存储引擎,它的缓冲池只缓存索引文件,而不缓存数据文件。索引和数据分开的,可以加载更多的索引,并且索引是压缩的,相对内存来说使用效率就提高不少,他使用一种表格锁定的机制,来优化多个并发读写操作。MYISAM强调了快速读取操作。

 使用场合:在承载的大部分项目是读多写少的项目平台中,而MyISAM的读性能是比Innodb强不少的

优点:占用空间小,处理速度快,

缺点: 不支持事务日志的完整性和并发性


NDB存储引擎:集群存储引擎,类似于Oracle的RAC集群(share everything),其结构是share nothing集群结构。数据全部放在内存中,因此主键查找的速度极快,并能在线添加NDB存储数据节点,面向OLTP。貌似mysql集群企业应用不多,因为技术和稳定性都不太成熟。


Memory存储引擎:数据全部房子啊内存,数据库重启或崩溃,表中数据消失,适合存储OLTP应用临时表,也可以作为OLAP数据库应用的数据仓库的维度表,默认使用hash索引而不是B+索引。

优点:存储速度快

缺点:缺乏稳定性和完整性


Infobright存储引擎:第三方存储引擎,存储按照列而非行的,故适合OLAP的数据库应用

merge(mrg_myisam)存储引擎:一组myisam表的组合, 这些myisam表必须结构完全相同,使用merge表来透明地对多个表进行查询和更新操作

NTSE存储引擎:网易开发面向内部使用的,目前不支持压缩、行级缓存等特性。

BDB: 源自Berkeley DB,事务型表的另一种选择

archive: 非常适合存储大量独立的、作为历史记录的数据, 它们不经常被读取, archive拥有高效的插入速度,但对查询的支持相对较差

CSV: 逻辑上由逗号分割数据的存储引擎

BlackHole: 黑洞引擎,写入的任何数据都会消失,一般用于记录binlog, 做复制的中继。

等存储引擎!


mysql下查看存储引擎:

(1)、查询Mysql支持的引擎

Mysql->show engines;

Mysql->show engines\G;    +G和不加G两种不同的显示方式。

(2)、查询Mysql支持引擎的信息

Mysql->show variables like ‘have%’

(3)、查询Mysql默认存储引擎

Mysql-> show variables like‘storage_engine‘;

 如果想修改存储引擎,可以在my.ini中进行修改

Default-storage-engine=引擎类型

修改表的存储引擎:

alter table t1 engine = innodb;


事务:

transaction(事务):

所谓事务是用户定义的一个操作序列, 这些操作要么全做要么全不做, 是一个不可分割的工作单位

在MySQL中, 事务可以是一条sql语句、一组sql语句或是整个程序

只有innodb、bdb存储引擎支持事务

show engines\G

事务的4个特性(ACID)

Note: 注意engine

原子性(Atomicity):

原子意为最小的粒子, 或者说不能再分的事物, 组成事务的所有语句要么全部执行, 要么全部取消

一致性(Consistency):

指数据在同一个事务中, 前后应保持一致

s1读数据, s2也访问同一数据, 且修改了它, s1再读, 得到的数据与刚才不一样了, 这就违反了一致性

(s1在事务中)

隔离性(Isolation):

commit前, 某个事务的操作对其他session不可见

持久性(Durability):

当事务完成后, 其影响应该保留下来, 不能撤消

事务工作原理

若dml不在事务中, s1改了, s2马上就可以看到

若dml在事务中, commit前dml并没有作用到表, 而是记录在事务日志文件中

所以其他session看不到结果

commit时, 就将记录在事务日志f文件中的dml作用到表

当执行了commit或rollback后, 这个事务就结束了


锁的介绍:

计算机协调多个进程或线程并发访问某一资源的机制

除cpu/mem/hd外, 数据(或表、一行记录)也是一种供多用户共享、争用的资源

MySQL提供了多用户并发访问数据的能力,不同的dbms均提供了并发控制功能, 不同的开发工具往往也提供了实现数据库并发控制的命令

mysql常见的三种锁级别——表级锁、页面锁、行级锁;其中表级锁有两种模式——表共享读锁和表独占写锁。

MyISAM:
表级锁。对myisam表进行读操作的时候,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表>的写操作;
对myisam表进行写操作的时候,它会阻塞其他用户对同一表的读、写请求.

innodb
提供行锁(locking on row level),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表.

行级锁的优点如下:
1
)当很多连接分别进行不同的查询时减小LOCK状态。
2)如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。

行级锁的缺点如下:

1)比页级锁和表级锁要占用更多的内存。

2)进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。

3)容易出现死锁。

注意:nnodb不能确定操作的行,这个时候就使用的意向锁,也就是表锁

手动加锁

lock tables emp read|write;

unlock tables;或quit均会释放锁

flush tables with read lock; -- 所有表加读锁



图形化SQL查询分析器:

MYSQL Workbench

Toad for Mysql

Imysql-Front

其他相应工具:phpMyAdmin,navicat for mysqlmysqlQueryBrowser。

本文出自 “8430296” 博客,请务必保留此出处http://8440296.blog.51cto.com/8430296/1582129

mysql常识以及存储引擎,锁和事务