原文 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,它就直接执行!我们可以通过以下命令进行查询:
  1. mysql> show variables like "%autocommit%";
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | autocommit    | ON    |
  6. +---------------+-------+
  7. 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,查看创建表
  1. mysql> show create table user\G
  2. ENGINE=MyISAM

  3. mysql> show create table wp_users\G
  4. ENGINE=InnoDB
提示:MySQL5.1数据库的默认存储引擎为MyIASM

每一个MyIASM的表都对应与硬盘上的三个文件。这三个文件有一样的文件名,但是有不同的扩展名指示其类型用途:frm文件保存表的定义,这个文件并不是MyISAM引擎的一部分,而是服务器的一部分;MYD保存表的数据;MYI是表的索引文件。MYD和MYI是MyIASM的关键
  1. [root@db02 /]# ll /data/3306/data/mysql
  2. -rw-rw---- 1 mysql mysql   9996 Jun 20  2016 proc.frm
  3. -rw-rw---- 1 mysql mysql      0 Jun 20  2016 proc.MYD
  4. -rw-rw---- 1 mysql mysql   2048 Jun 20  2016 proc.MYI
  5. ---------------------分割线----------------------
  6. [root@db02 mysql]# file user.MYI 
  7. user.MYI: MySQL MISAM compressed data file Version 1
  8. [root@db02 mysql]# file user.MYD 
  9. user.MYD: DBase 3 data file (167514107 records)
  10. [root@db02 mysql]# file user.frm 
  11. 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。但是这个缓存区只会缓存索引,而不会缓存数据。
  1. [root@db01 ~]# grep key_buffer_  /etc/my.cnf 
  2. 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缓存服务可以极大的提高访问效率,网站动态内容静态化,减少对数据库的访问。
  1. [root@db02 oldboy]# grep query /data/3306/my.cnf
  2. query_cache_size = 2M
  3. query_cache_limit = 1M
  4. query_cache_min_res_unit = 2k
8.MyISAM的Count只有在全表扫描的时候特别搞笑,带有其他条件的count都需要进行实际的数据访问
  1. mysql> select count(*) from mysql.user;
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. |       11 |
  6. +----------+
  7. 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
  1. [root@db02 oldboy]# ll /data/3306/data/oldboy
  2. total 16
  3. -rw-r--r-- 1 root root   65 Jul  4 00:03 db.opt
  4. -rw-r--r-- 1 root root 8644 Jul  4 00:03 student.frm
提示:只有student.from没有MyIASM对应的数据文件和索引文件了,这是为什么?
  1. [root@db02 oldboy]# ll /data/3306/data/
  2. total 143432
  3. drwxr-xr-x 2 root  root       4096 Jul  4 00:03 aaa
  4. drwxr-xr-x 2 root  root       4096 Jul  4 00:03 cyh
  5. drwxr-xr-x 2 root  root       4096 Jul  4 00:03 dadadadadadad
  6. -rw-r--r-- 1 root  root  134217728 Jul  4 00:03 ibdata1 存放InnoDB数据的文件
配置路径
  1. [root@db02 oldboy]# grep ibdata /data/3306/my.cnf
  2. innodb_data_file_path = ibdata1:128M:autoextend
  3. 可以修改为:
  4. ibdata1:128M:ibdata2:128M:autoextend
  5. 企业场景尽量调大一点

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
  1. [root@db02 oldboy]# grep -i innodb /data/3306/my.cnf
  2. #default_table_type = InnoDB
  3. innodb_additional_mem_pool_size = 4M
  4. innodb_buffer_pool_size = 32M
  5. innodb_data_file_path = ibdata1:128M:autoextend
  6. innodb_file_io_threads = 4
  7. innodb_thread_concurrency = 8
  8. innodb_flush_log_at_trx_commit = 2
  9. innodb_log_buffer_size = 2M
  10. innodb_log_file_size = 4M
  11. innodb_log_files_in_group = 3
  12. innodb_max_dirty_pages_pct = 90
  13. innodb_lock_wait_timeout = 120
  14. innodb_file_per_table = 0
共享表空间对应物理数据文件:
  1. [root@db02 oldboy]# ll /data/3306/data/ibdata1 
  2. -rw-r--r-- 1 root root 134217728 Jul  4 00:03 /data/3306/data/ibdata1
独立表空间对应物理数据文件:
  1. innodb_file_per_table
  2. 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、避免主键更新,因为这会带来大量的数据移动
  1. innodb_buffer_pool_size = 2048 
  2. innodb_flush_log_at_trx_commit = 1  #设置为0就等于innodb_log_buffer_size队列满后在统一存储,默认为1,也是最安全的设置。
  3. innodb_file_per_table = 0  #InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。0关闭,1开启。
  4. 独立表空间优点:
  5. 1、每个表都有自己独立的表空间。
  6. 2、每个表的数据和索引都会存在自己的表空间中。
  7. 3、可以实现单表在不同的数据库中移动。
  8. 4、空间可以回收(除drop table操作处,表空不能自己回收。)

生产环境中如何批量更改MySQL引擎

一般来说这样的需求不多见,但偶尔也会有。
(1)M月SQL语句修改
  1. 创建后引擎的更改,5.0以上
  2. ALTER TABLE OLDBOY ENGINE = INNODB;
  3. ALTER TABLE OLDBOY ENGINE = MyISAM;
更改引擎实例
  1. mysql> ALTER TABLE pre_ucenter_vars ENGINE = INNODB;
  2. Query OK, 0 rows affected (0.33 sec)
  3. Records: 0  Duplicates: 0  Warnings: 0
  4. 查看修改后结果
  5. mysql>show create table pre_ucenter_vars\G
(2)使用sed对备份内容进行引擎切换
  1. mysqldump >bak.sql
  2. nohup sed -e 's/MyIASM/InnoDB/g' bak.sql >innodb.sql &
  3. mysql< innodb.sql
  4. 数据量不好
(3)mysql convert table format命令修改
  1. 独立命令:
  2. mysql_conver_table_format --user=root --password=123456 --socket=/data/3306/mysql.sock --engine=MyIASM oldboy t2
  3. 依赖:yum -y install perl-DBI perl-DBD-MySQL  perl-Time-Hires
或者在建表时的语句加上指定引擎
  1. CREATE TABLE `test` (
  2.   `id` bigint(12) NOT NULL auto_increment COMMENT '主键',
  3.   `name` varchar(12) NOT NULL COMMENT '姓名',
  4.   PRIMARY KEY  (`id`)
  5. ) 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或者混合
  1. mysqldump -uroot -p123456 -A -x -B -F -R --master-data=2|gzip >/data/bak$(date +%F).sql.gz
innodb
  1. mysqldump -uroot -p123456 -A -b -f -r --master-data=2 --single-transaction|gzip >/data/bak.sql.gz
4.设置my.cnf

MySQL事务及字符集介绍相关推荐

  1. mysql数据库执行事务日志_第十章 MySQL事务及其日志介绍

    一.数据库升级 #1.提出方案 1)升级的方法 2)升级的步骤 3)升级的时间 4)升级步骤可能会出现的问题 5)出现的问题怎么解决,解决时间 6)升级后出现的问题 #2.搭建新的数据库 #3.备份就 ...

  2. MySQL事务隔离级别介绍

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读 ...

  3. MySQL事务的的介绍及使用

    2019独角兽企业重金招聘Python工程师标准>>> 1. 事务的特性 1.1 原子性(Atomicity): 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么 ...

  4. 使用mysql事务管理_MySQL事务管理的介绍(附示例)

    原标题:MySQL事务管理的介绍(附示例) 事务处理用来维护数据库等完整性,保证mysql操作要么成功,要么失败(myisam不支持事务) 1.关键词 事务(transaction)指一组SQL语句; ...

  5. Mysql事务字符集

    Mysql事务 Innodb存储引擎的中的事务完全服务ACID: 原子性.2.一致性.3.隔离性.4.持久性 理解上和oracle类似. 事务隔离级别 1.Read uncommitted 读未提交: ...

  6. mysql事务用法介绍及储存引擎介绍(MyLSAM,Innodb)

    文章目录 前言 事务 什么是事务 事务的3大范式 事务的三大特点 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 控制事务 ...

  7. MySQL事务隔离级别和Spring事务关系介绍

    事务隔离级别介绍 隔离级别 脏读 不可重复读 幻读 未提交读(Read uncommitted) 可能 可能 可能 已提交读(Read committed) 不可能 可能 可能 可重复读(Repeat ...

  8. mysql 数据库字符集转换_字符集介绍及mysql数据库编码转换

    一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...

  9. mysql 查询编码转换_字符集介绍及mysql数据库编码转换

    一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...

最新文章

  1. 《全球人工智能产业地图》发布(附PPT图片)
  2. JAVA正则表达式:Pattern类与Matcher类详解(转)
  3. python啥意思-python是什么意思
  4. java成绩排名平均成绩_java 数组 输入5名学生的成绩 得出平均分。
  5. 安徽省2021年高考各科成绩查询,2021年安徽高考总分是多少 考试科目及各科分数...
  6. 蚂蚁金服自研分布式关系数据库OceanBase上线阿里云
  7. PHP 利用cron 实现文章同步至新浪、网易等微博
  8. C#LeetCode刷题之#686-重复叠加字符串匹配(Repeated String Match)
  9. 【浏览器】浏览器模式与文档模式区别
  10. 理想汽车CEO李想深夜回应“水银事件”:百分百支持你去报案
  11. Linux目录结构示意详解图
  12. 网易的企业免费邮箱和腾讯的企业邮箱
  13. idea swagger生成接口文档_Springboot结合swagger-ui自动生成接口文档
  14. 国标28181:实时视频播放
  15. 机械硬盘无法访问要怎么办啊
  16. window版ELK搭建
  17. 专家提醒:“对乙酰氨基酚”(该品国际非专有药名为Paracetamol,商品名很多)不宜过量使用
  18. java数独最快解_java快速解数独
  19. 第一章 Arm 架构科普解读(2023新)
  20. 编程是门艺术_是编程艺术吗?

热门文章

  1. java source folder作用_java项目把源码放到folder里,不是source folder,这个java代码还能被调用吗?...
  2. android 手机号码显示加空格,Android实现输入手机号时自动添加空格
  3. html里面Meta标签的使用
  4. android dropbox切换账户,android – 如何获取我的APP_KEY和SECRET_KEY的Dropbox同步?
  5. sql backup database备份d盘_SQL数据库备份概述
  6. To disable deprecation,,use _CRT_SECURE_NO_WARNINGS
  7. 陕西居民医保微信缴纳教程来了,太方便了
  8. SyntaxError: Non-UTF-8 code starting with ‘\xe2‘ 今天是小白上线的一天
  9. SSP状态寄存器SSPSTAT
  10. 使用 docker 搭建 nginx+php-fpm 环境 (两个独立镜像)