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

常见的数据库系统:php

1、甲骨文的Oraclemysql

2IBMDB2web

3、微软的Access SQL Serversql

4、开源PostgreSQL数据库

5、开源MySQL 缓存


mysql数据库三阶段session

初期开源数据库阶段并发

sun mysql阶段oracle

oracle mysql阶段ide


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

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

mysql分支版本(一些):

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

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

InnoSQL:一、InnoDB Flash Cache:将SSD做为Flash Cache  二、InnoDB Share Memory :将Share Memory做为InnoDB的共享内存,以此提升数据库的预热。三、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)容易出现死锁。

注意:Innodb不能肯定操做的行,这个时候就使用的意向锁,也就是表锁

手动加锁

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。