常见的数据库系统:
1、甲骨文的Oracle
2、IBM的DB2
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 mysql,mysqlQueryBrowser。