原文 http://www.abcdocker.com/abcdocker/77
事务介绍
简单来说,事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,执行时要么全成功要么全失败。
MySQL5.5支持事务的引擎:Innodb/ndb
事务四大特性(ACID)
1.原子性(Atomicity)
事务是一个不可分割的单位,事务中的所有SQL等操作要么全都发生,要么都不发生
2.一致性(Consistency)
事务发生前和发生后,数据的完整性必须保持一致
3.隔离性(Isolation)
当并发访问访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据库是相互隔离的。
4.持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。如果出了错误,事务也不允许撤销,只能通过“补偿性事务”
事务的开启
数据库默认事务是自动提交的,也就是发一条sql它就执行一条。如果想多条sql放在一个事务中执行,则需要使用事务进行处理。当我们开启一个事务,并且没有提交,mysql会自动回滚事务,或者我们使用rolback命令回滚事务。
MySQL默认是自动提交的,也就是提交一个QUERY,它就直接执行!我们可以通过以下命令进行查询:
mysql> show variables like "%autocommit%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
禁止自动提交
mysql>set global autocommit=OFF
mysql>set global autocommit=NO 开启自动提交
rolback回滚事务(oracle)
commit提交事务(oracle)
MySQL引擎概述
1.1 什么是存储引擎?
我们先来个比喻,我们都知道录制一个视频文件,可以转成不同的格式如mp4、avi、wmv等,而存在我们电脑的磁盘上也会存在不同类型的文件系统中windows里常见的nfs,fat32.存在于linux常见的ext3,ext4,xfs。但是我们活着用户看到实际视频内容是一样的。直观区别是,占用系统的空间大小与清晰程度可能不一样
1.2 MySQL存储引擎架构
MySQL的存储引擎是MySQL数据库的重要组成部分,MySQL常用的表的引擎为MyISAM和InnoDB两种。MySQL的美中存储引擎在MySQL里通过插件的方式使用的。MySQL可以同时支持多种存储引擎。
MyISAM引擎介绍
1.1什么是MyIASM引擎?
MyIASM引擎是MySQL关系数据库管理系统的默认存储引擎(MySQL 5.5.5以前)这种MySQL表的存储结构从旧的IASM代码扩展出许多有用的功能。在新版本的MySQL中,InnoDB引擎由于对事物参考完成行,以及更好的并发性等优点开始逐渐的取代MyIASM引擎。
可以使用show create table 库名\G,查看创建表
mysql> show create table user\G
ENGINE=MyISAM
mysql> show create table wp_users\G
ENGINE=InnoDB
提示:MySQL5.1数据库的默认存储引擎为MyIASM
每一个MyIASM的表都对应与硬盘上的三个文件。这三个文件有一样的文件名,但是有不同的扩展名指示其类型用途:frm文件保存表的定义,这个文件并不是MyISAM引擎的一部分,而是服务器的一部分;MYD保存表的数据;MYI是表的索引文件。MYD和MYI是MyIASM的关键
[root@db02 /]# ll /data/3306/data/mysql
-rw-rw---- 1 mysql mysql 9996 Jun 20 2016 proc.frm
-rw-rw---- 1 mysql mysql 0 Jun 20 2016 proc.MYD
-rw-rw---- 1 mysql mysql 2048 Jun 20 2016 proc.MYI
---------------------分割线----------------------
[root@db02 mysql]# file user.MYI
user.MYI: MySQL MISAM compressed data file Version 1
[root@db02 mysql]# file user.MYD
user.MYD: DBase 3 data file (167514107 records)
[root@db02 mysql]# file user.frm
user.frm: MySQL table definition file Version 9
提示:系统大多数用的是MyISAM引擎
1、为什么MySQL5.5 以前默认是mysiasm引擎,而mysql5.5.5 以后默认是innodb?
2、为什么mysql库内部表默认是mysqlisam引擎?
1.2 MyISAM引擎特点(此处面试最好全说出来)
1.不支持事务
(事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败)
2.表级锁定,数据更新时锁定整个表:其锁表机制是表级锁定,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。
3.读写互相阻塞:不仅会在写入的时候阻塞读取,MyIASM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
4.只会缓存索引:MyIASM可以通过key_buffer_size缓存索引,以大大提高访问性能减少磁盘IO。但是这个缓存区只会缓存索引,而不会缓存数据。
[root@db01 ~]# grep key_buffer_ /etc/my.cnf
key_buffer_size = 16K
5.读取速度较快,占用资源相对少
6.不支持外键约束,但支持全文索引
7.MyISAM引擎是MySQL5.5.5 前缺省的存储引擎
1.3 MyIASM引擎适用的生产业务场景
1)不需要事务支持的业务(例如转账就不行)
2)一般为读数据比较多的应用,读写都频繁场景不适合,读多或者写多的都适合。
3)读写并发访问相对较低的业务(纯读纯写高并发也可以)(锁定机制问题)
4)数据修改相对较少的业务(阻塞问题)
5)以读为主的业务,例如:数据库系统表、www、blog图片信息数据库,用户数据库。商品库等业务
6)对硬件一致性要求不是非常高的业务(不支持事务)
7)硬件资源比较差的机器可以用MySAM(占用资源少)
8)使用读写分离的MySQL从库可以使用MyIASM
小结:单一对数据库的操作都可以使用MyIASM,所以单一就是尽量纯读,或纯写(insert,update,delete)等
1.4 MyIASM引擎调优精要
1.设置合适的索引(缓存机制)
2.调整读写优先级,根据实际需求确保重要操作更优先执行。
3.启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)
4.尽量顺序操作让insert数据都写入到尾部,减少阻塞
5.分解大的时间长的SQL操作,降低单个操作的阻塞时间。
6.降低并发数(减少对MySQL访问),某些高并发场景通过应用进行排队队列机制
7.对于相对静态(更改不频繁)的数据库数据,充分利用Query Cache或memcached缓存服务可以极大的提高访问效率,网站动态内容静态化,减少对数据库的访问。
[root@db02 oldboy]# grep query /data/3306/my.cnf
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
8.MyISAM的Count只有在全表扫描的时候特别搞笑,带有其他条件的count都需要进行实际的数据访问
mysql> select count(*) from mysql.user;
+----------+
| count(*) |
+----------+
| 11 |
+----------+
1 row in set (0.00 sec)
9.可以把主从同步的主库使用innodb,从库使用MyIASM引擎(不推荐)
InnoDB引擎
1.1 什么是InnoDB引擎?
InnoDB引擎是MySQL数据库的另一个重要的存储引擎,整成为目前MySQL AB所发行新版的标准,被包含在所有二进制安装包里。和其他的存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgerSQL)以及参数完整性(即对外键的支持)
Oracle公司2005年10月收购了Innobase。Innobase采用双认证授权,它使用GUN发行,也允许其他想将InnoDB结合到商业软件的团体获得授权。
MySQL5.5.5以后数据库的默认存储引擎为InnoDB
[root@db02 oldboy]# ll /data/3306/data/oldboy
total 16
-rw-r--r-- 1 root root 65 Jul 4 00:03 db.opt
-rw-r--r-- 1 root root 8644 Jul 4 00:03 student.frm
提示:只有student.from没有MyIASM对应的数据文件和索引文件了,这是为什么?
[root@db02 oldboy]# ll /data/3306/data/
total 143432
drwxr-xr-x 2 root root 4096 Jul 4 00:03 aaa
drwxr-xr-x 2 root root 4096 Jul 4 00:03 cyh
drwxr-xr-x 2 root root 4096 Jul 4 00:03 dadadadadadad
-rw-r--r-- 1 root root 134217728 Jul 4 00:03 ibdata1 存放InnoDB数据的文件
配置路径
[root@db02 oldboy]# grep ibdata /data/3306/my.cnf
innodb_data_file_path = ibdata1:128M:autoextend
可以修改为:
ibdata1:128M:ibdata2:128M:autoextend
企业场景尽量调大一点
InnoDB引擎特点
1.支持事务:支持4个事务隔离级别,支持多版本读。
2.行级锁定(更新时一定是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。
3.读写阻塞与事务隔离级别相关。
4.具有非常搞笑的缓存特性:能缓存索引,也能缓存数据。
5.整个表和主键以Cluster方式存储,组成一颗平衡树。
6.所有Secondary Index都会保存主键信息
7.支持分区,表空间,类似oracle数据库
8.支持外键约束 5.5 以后不支持全文索引,以后支持了。
9.和MyIASM引擎相比,InnoDB对硬件资源要求比较高。
InnoDB特点:面试必答题
1.Row-level locking #行级锁
2.Full-text search indexs #全文索引
3.Data caches #缓存数据
4.Index caches #索引缓存
5.Transactions #支持事务
6.占用资源多
7.读写阻塞与事务隔离级别相关。
8.外键
InnoDB引擎使用的生产业务场景
1、需要事务支持的业务(具有较好的事务特性)
2、行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
3、数据读写及更新都较为频繁的场景,如:BBS。SNA。微博,微信等。
4、数据一致性要求较高的业务,例如:充值转账、银行卡转账。
5、硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘IO
[root@db02 oldboy]# grep -i innodb /data/3306/my.cnf
#default_table_type = InnoDB
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
共享表空间对应物理数据文件:
[root@db02 oldboy]# ll /data/3306/data/ibdata1
-rw-r--r-- 1 root root 134217728 Jul 4 00:03 /data/3306/data/ibdata1
独立表空间对应物理数据文件:
innodb_file_per_table
innodb_data_home_dir
InnoDB引擎调优精要
1、主键尽可能小,避免给Secondary index 带来过大的空间负担
2、建立有索引避免全表扫描,因为会使用表锁。
3、尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO消耗
4、在大批量小插入的视乎,尽量自己控制事务而不要使用autocommit自动提交,有开关可以控制提交方式:
5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性。
如果Innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不会任何操作。
6、避免主键更新,因为这会带来大量的数据移动
innodb_buffer_pool_size = 2048
innodb_flush_log_at_trx_commit = 1 #设置为0就等于innodb_log_buffer_size队列满后在统一存储,默认为1,也是最安全的设置。
innodb_file_per_table = 0 #InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。0关闭,1开启。
独立表空间优点:
1、每个表都有自己独立的表空间。
2、每个表的数据和索引都会存在自己的表空间中。
3、可以实现单表在不同的数据库中移动。
4、空间可以回收(除drop table操作处,表空不能自己回收。)
生产环境中如何批量更改MySQL引擎
一般来说这样的需求不多见,但偶尔也会有。
(1)M月SQL语句修改
创建后引擎的更改,5.0以上
ALTER TABLE OLDBOY ENGINE = INNODB;
ALTER TABLE OLDBOY ENGINE = MyISAM;
更改引擎实例
mysql> ALTER TABLE pre_ucenter_vars ENGINE = INNODB;
Query OK, 0 rows affected (0.33 sec)
Records: 0 Duplicates: 0 Warnings: 0
查看修改后结果
mysql>show create table pre_ucenter_vars\G
(2)使用sed对备份内容进行引擎切换
mysqldump >bak.sql
nohup sed -e 's/MyIASM/InnoDB/g' bak.sql >innodb.sql &
mysql< innodb.sql
数据量不好
(3)mysql convert table format命令修改
独立命令:
mysql_conver_table_format --user=root --password=123456 --socket=/data/3306/mysql.sock --engine=MyIASM oldboy t2
依赖:yum -y install perl-DBI perl-DBD-MySQL perl-Time-Hires
或者在建表时的语句加上指定引擎
CREATE TABLE `test` (
`id` bigint(12) NOT NULL auto_increment COMMENT '主键',
`name` varchar(12) NOT NULL COMMENT '姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
有关MySQL企业常见企业面试题
1.MySQL有哪些存储引擎,各自有什么特点和区别?
MySQL5.5 :MyIASM Memory InnoDB NDB
2.生产环境中应如何选用MySQL的引擎?
在一般生产既有读又有写的业务中,建议使用Innodb引擎,一句话尽可能多的使用innodb引擎
纯写,纯写可用myisam。例如系统的MySQL库
3.不同的引擎如何备份?混合引擎如何备份。
myisam或者混合
mysqldump -uroot -p123456 -A -x -B -F -R --master-data=2|gzip >/data/bak$(date +%F).sql.gz
innodb
mysqldump -uroot -p123456 -A -b -f -r --master-data=2 --single-transaction|gzip >/data/bak.sql.gz
4.设置my.cnf