15、mysql事物和引擎

15.1、数据库事物介绍:

1、什么是数据库事物:

2、事物的四大特性:

15、mysql事物和引擎

15、mysql事物和引擎

3、事物的开启:

15、mysql事物和引擎

提交事物:

commit;

设置全局自动提交或不提交事物:

set global autocommit = ON/OFF;

回滚事物:

rollback;

4、mysql事务的并发问题:

(1)脏读:事务A读取了事务B更新未提交的数据然后B回滚操作,那么A读取到的数据是脏数据;

(2)不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致;

(3)幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录并提交,

当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读;

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除,解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表;

5、mysql的事物隔离级别:

(1)mysql隔离级别和事物并发对应的关系:

15、mysql事物和引擎

事物隔离的级别越高,则并发性就越差;

(2)my.cnf配置:

transaction_isolation = READ-COMMITTE

###########################################################

#1.READ-UNCOMMITTED读未提交;2.READ-COMMITTE读已提交;

#3.REPEATABLE-READ可重复读(默认);4.SERIALIZABLE串行;

###########################################################

binlog_format = mixed

##########################################################

#row,statement模式,mixed兼容row和statement;

#innodb的事务隔离级别是read-commited或read-uncommited模式时,

#binlog不可以使用statement模式;

##########################################################

15.2、mysql引擎介绍:

1、什么是存储引擎:

15、mysql事物和引擎

2、查看数据库支持的引擎:

mysql> show engines\G;

*************************** 1. row ***************************

Engine: CSV

Support: YES

Comment: CSV storage engine

Transactions: NO

XA: NO

Savepoints: NO

*************************** 2. row ***************************

Engine: InnoDB

Support: DEFAULT

Comment: Supports transactions, row-level locking, and foreign keys

Transactions: YES

XA: YES

Savepoints: YES

*************************** 3. row ***************************

Engine: MRG_MYISAM

Support: YES

Comment: Collection of identical MyISAM tables

Transactions: NO

XA: NO

Savepoints: NO

*************************** 4. row ***************************

Engine: BLACKHOLE

Support: YES

Comment: /dev/null storage engine (anything you write to it disappears)

Transactions: NO

XA: NO

Savepoints: NO

*************************** 5. row ***************************

Engine: MyISAM

Support: YES

Comment: MyISAM storage engine

Transactions: NO

XA: NO

Savepoints: NO

*************************** 6. row ***************************

Engine: MEMORY

Support: YES

Comment: Hash based, stored in memory, useful for temporary tables

Transactions: NO

XA: NO

Savepoints: NO

*************************** 7. row ***************************

Engine: FEDERATED

Support: NO

Comment: Federated MySQL storage engine

Transactions: NULL

XA: NULL

Savepoints: NULL

*************************** 8. row ***************************

Engine: PERFORMANCE_SCHEMA

Support: YES

Comment: Performance Schema

Transactions: NO

XA: NO

Savepoints: NO

3、查看表的引擎:

mysql> show create table test\G;

*************************** 1. row ***************************

Table: test

Create Table: CREATE TABLE `test` (

`id` int(4) NOT NULL AUTO_INCREMENT,

`name` varchar(30) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

4、MyISAM引擎:

(1)什么是MyISAM引擎:

15、mysql事物和引擎

15、mysql事物和引擎

15、mysql事物和引擎

(2)MyISAM引擎的特点:

15、mysql事物和引擎

15、mysql事物和引擎

(3)MyISAM引擎使用的生产业务场景:

15、mysql事物和引擎

(4)MyISAM引擎调优:

15、mysql事物和引擎

15、mysql事物和引擎

15、mysql事物和引擎

15、mysql事物和引擎

5、InnoDB引擎:

(1)InnoDB引擎介绍:

(2)InnoDB引擎的特点:

(3)InnoDB引擎使用的生产业务场景:

15、mysql事物和引擎

15、mysql事物和引擎

(4)InnoDB引擎调优:

15、mysql事物和引擎

6、如何批量更改数据库引擎:

(1)方法1:

mysqldump -uroot -p123456 -R -x -F --master-data=1 -B lc >/tmp/lc_bak.sql &

sed -i "s#MyISAM#InnoDB#g" /tmp/lc_bak.sql &

mysql -uroot -p123456 </tmp/lc_bak.sql &

(2)方法2:

mysql_convert_table_format --user=root --password=123456 --socket=/data/3306/mysql.sock --engine=InnoDB lc

7、总结:

(1) 事务支持:

MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,

自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交,

减小数据库多次提交导致的开销,大大提高性能。

(2) 存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。

.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一个数据文件中ibdatat1(也可能是多个ibdata1文件,或者是独立的表空间文件(.frm表结构,.ibd表数据,ibdata1索引)),

InnoDB表的大小只受限于操作系统文件的大小,一般设置为2GB。

(3) 存储空间:

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、

动态表、压缩表。InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

(4) 可移植性、备份及恢复:

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

(5) 事务支持:

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力

(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

(6) AUTO_INCREMENT:

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,

他可以根据前面几列进行排序后递增。InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,

如果是组合索引也必须是组合索引的第一列。

(7) 表锁差异:

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,

如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,

只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

MyISAM锁的粒度是表级,而InnoDB支持行级锁定。简单来说就是, InnoDB支持数据行锁定,而MyISAM不支持行锁定,

只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,

默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。

因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

(8) 全文索引:

MyISAM:支持(FULLTEXT类型的)全文索引

InnoDB:不支持(FULLTEXT类型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,

因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

另外,MyIsam索引和数据分离,InnoDB在一起,MyIsam天生非聚簇索引,最多有一个unique的性质,InnoDB的

数据文件本身就是主键索引文件,这样的索引被称为“聚簇索引”

(9) 表主键:

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,

附加索引保存的是主索引的值。InnoDB的主键范围更大,最大是MyISAM的2倍。

(10) 表的具体行数:

MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。

InnoDB:没有保存表的总行数(只能遍历),如果使用select count(*) from table;就会遍历整个表,消耗相当大,

但是在加了wehre条件后,myisam和innodb处理的方式都一样。

(11) CURD操作:

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,

但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,

最好使用truncate table这个命令。

(12) 外键:

MyISAM:不支持

InnoDB:支持

(13) 查询效率:

没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。

所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?

因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。

所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。

MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。通过上述的分析,基本上可以考虑使用InnoDB

来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,

在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能

最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

(14)MyISAM和InnoDB两者的应用场景:

1) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

2) InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

default-storage-engine = MyISAM

default-storage-engine = InnoDB