Mysql 中不commit也可以改变数据库吧,那么写不写commit命令有什么区别呢

Mysql 中不commit也可以改变数据库吧,那么写不写commit命令有什么区别呢,第1张

这个要看你用什么“存储引擎”

如果是不支持事务的引擎,如myisam,则是否commit都没有效的。

如果是支持事务的引擎,如innodb,则有系统参数设置是否自动commit,查看参数如下:

mysql> show variables like '%autocommit%';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit | ON |

+---------------+-------+

1 row in set (000 sec)

mysql>

显示结果为on表示事务自动提交,也即不用手工去commit。

当然,你可以设置其为OFF,然后自己手工去commit。

1、体积不同。

Oracle它体积比较庞大,一般是用来开发大型应用(例如分布式)的。而MySQL的体积相对来说比较小,较之Oracle更容易安装、维护以及管理, *** 作也简单,最重要的是它是三个中唯一一个开源数据库,但目前也属于Oracle公司的产品了。

2、容量不同。

Oracle容量无限,根据配置决定;而MySQL使用MyISAM存储引擎,最大表尺寸为65536TB。 MySQL数据库的最大有效表尺寸通常是由 *** 作系统对文件大小的限制决定的,而不是由MySQL内部限制决定。

3、平台支持及速度的区别。

Oracle支持大多数平台;而MySQL支持各种平台,适合Linux。至于速度,Oracle在Linux下的性能,在少量数据时速度低于MySQL,在千万级时速度快于MySQL。

4、数据库崩溃造成的影响不同。

Oracle数据库崩溃后恢复很麻烦,因为他把很多东西放在内存里;数据库连接要慢些,最好用连接池;而MySQL使用缺省的IP端口,但是有时候这些IP也会被一些黑客闯入,使用MyISAM配置,不慎损坏数据库,结果可能会导致所有的数据丢失。

5、性能的区别。

Oracle全面,完整,稳定,但一般数据量大,对硬件要求较高 ;而MySQL使用CPU和内存极少,性能很高,但扩展性较差。

6、授权价格区别。

Oracle价格较贵,例如Oracle 10G/11G 标准版 [10用户]¥25600 ,Oracle 10G/11G 标准版 [1CPU无限用户] ¥157600。而MySQL采用双重授权,他们是GPL和MySQLAB制定的商业许可协议。如果你在一个遵循GPL的自由项目中使用 MySQL,那么你可以遵循GPL协议免费使用MySQL。否则,你需要购买MySQLAB制定的那个商业许可协议。

此文章主要向大家介绍的是MySQL数据库优化 其中还包括MySQL数据库的性能优化 常用的SQL语句的优化以及MySQL数据库对INSERT语句进行优化的实际 *** 作方案的描述 望你会有所收获

MySQL InnoDB 的性能问题讨论

MySQL性能优化

InnoDB delete from xxx速度暴慢原因

推荐圈子: mysql研究

更多 定期分析表和检查表

分析表的语法如下

引用

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb _name[ tbl_name]

以上语句用于分析和存储表的关键字分布 分析的结果将可以使得系统得到准确的统计信息 使得SQL能够生成正确的执行计划 如果用户感觉实际执行计划并不是预期的执行计划 执行一次分析表可能会解决问题 在分析期间 使用一个读取锁定对表进行锁定 这对于MyISAM DBD和InnoDB表有作用

例如分析一个数据表

引用

yze table table_name

检查表的语法如下

引用

CHECK TABLE tb _name[ tbl_name] [option] option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}

检查表的作用是检查一个或多个表是否有错误 CHECK TABLE 对MyISAM 和 InnoDB表有作用 对于MyISAM表 关键字统计数据被更新

CHECK TABLE 也可以检查视图是否有错误 比如在视图定义中被引用的表不存在

定期优化表

MySQL数据库优化表的语法如下

引用

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb _name [ tbl_name]

如果删除了表的一大部分 或者如果已经对含有可变长度行的表(含有 VARCHAR BLOB或TEXT列的表)进行更多更改 则应使用OPTIMIZE TABLE命令来进行表优化 这个命令可以将表中的空间碎片进行合并 并且可以消除由于删除或者更新造成的空间浪费 但OPTIMIZE TABLE 命令只对MyISAM BDB 和InnoDB表起作用

例如 optimize table table_name

注意 yze check optimize执行期间将对表进行锁定 因此一定注意要在数据库不繁忙的时候执行相关的 *** 作

常用的SQL优化

我们在开发的时候常常用到的SQL语句 无非是INSERT GROUPBY等等 对于这些SQL语句 我们怎么进行优化?

大批量插入数据

当用load命令导入数据的时候 适当的设置可以提高导入的速度

对于MyISAM存储引擎的表 可以通过如下方式快速的导入大量的数据

引用

ALTER TABLE tb _name DISABLE KEYS;

loading the data

ALTER TABLE tb _name ENABLE KEYS;

DISABLE KEYS 和 ENABLE KEYS 用来打开或者关闭MyISAM表非唯一索引的更新 在导入大量的数据到一个非空的MyISAM表时 通过设置这两个命令 可以提高导入的效率

对于导入大量的数据到一个空的MyISAM表时 默认就是先导入数据然后才创建索引的 索引不用进行设置

引用

load data infile /home/mysql/text_txt into table text

对于InnoDB类型的表 这种方式不能提高导入数据的效率 但也有几种针对InnoDB类型的表进行MySQL数据库优化的方式

因为InnoDB类型的表式按照主键的顺序保存的 所以将导入的数据按照主键的顺序排序 可以有效提高导入数据的效率

在导入数据前执行 SET UNIQUE_CHECKS= 关闭唯一性校验 在导入结束后执行SET UNIQUE_CHECKS= 恢复唯一性校验 可以提高导入的效率

如果应用使用自动提交的方式 建议在导入前执行SET AUTOMIT= 关闭自动提交 导入结束后执行SET AUTOMIT= 打开自动提交 也可以提高导入效率

MySQL数据库优化INSERT语句

当进行数据INSERT的时候 可以考虑采用以下几种方式进行优化

如果同时从一个客户插入很多行 尽量使用多个值表的INSERT语句 这种方式将大大缩短客户端与数据库的链接 关闭等消耗 使得效率比分开执行的单个INSERT语句快

例如

insert into test values( )

insert into test values( )

insert into test values( )

将上面三句改为:insert into test values( ) ( ) ( )

如果从不同客户插入很多行 能通过使用INSERT DELAYED 语句得到更高的速度

DELAYED 的含义是让INSERT 语句马上执行 其实数据都被放在内存的队列中 并没有真正写入磁盘 这比每条语句分别插入要快得多 LOW_PRIORITY刚好相反 在所有其他用户对表的读写完后才进行插入

将索引文件和数据文件分在不同的磁盘上存放

如果进行批量插入 可以增加bulk_insert_buffer_size变量值的方法来提高速度 但是 这只能对于MyISAM表使用

当从一个文本文件中装载一个表时 使用LOAD DATA INFILE 这通常比使用很多insert语句快 倍左右

lishixinzhi/Article/program/MySQL/201311/29324

回答的有点多请耐心看完。

希望能帮助你还请及时采纳谢谢

1事务的原理

事务就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。MySQL事务处理只支持InnoDB和BDB数据表类型。

1事务的ACID原则

1(Atomicity)原子性: 事务是最小的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用;

2(Consistency)一致性: 执行事务前后,数据保持一致;

3(Isolation)隔离性: 并发访问数据库时,一个事务不被其他事务所干扰。

4(Durability)持久性: 一个事务被提交之后。对数据库中数据的改变是持久的,即使数据库发生故障。

1缓冲池(Buffer Pool)

Buffer Pool中包含了磁盘中部分数据页的映射。当从数据库读取数据时,会先从Buffer Pool中读取数据,如果Buffer Pool中没有,则从磁盘读取后放入到Buffer Pool中。当向数据库写入数据时,会先写入到Buffer Pool中,Buffer Pool中更新的数据会定期刷新到磁盘中(此过程称为刷脏)。

2日志缓冲区(Log Buffer)

当在MySQL中对InnoDB表进行更改时,这些更改命令首先存储在InnoDB日志缓冲区(Log Buffer)的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。

3双写机制缓存(DoubleWrite Buffer)

Doublewrite Buffer是共享表空间的物理文件的 buffer,其大小是2MB是一个一分为二的2MB空间。

刷脏 *** 作开始之时,先进行脏页‘备份’ *** 作将脏页数据写入 Doublewrite Buffer

将Doublewrite Buffer(顺序IO)写入磁盘文件中(共享表空间) 进行刷脏 *** 作

4回滚日志(Undo Log)

Undo Log记录的是逻辑日志记录的是事务过程中每条数据的变化版本和情况

在Innodb 磁盘架构中Undo Log 默认是共享表空间的物理文件的Buffer

在事务异常中断,或者主动(Rollback)回滚的过程中 ,Innodb基于 Undo Log进行数据撤销回滚,保证数据回归至事务开始状态

5重做日志(Redo Log)

Redo Log通常指的是物理日志,记录的是数据页的物理修改并不记录行记录情况。(也就是只记录要做哪些修改,并不记录修改的完成情况) 当数据库宕机重启的时候,会将重做日志中的内容恢复到数据库中。

1原子性

Innodb事务的原子性保证,包含事务的提交机制和事务的回滚机制在Innodb引擎中事务的回滚机制是依托 回滚日志(Undo Log) 进行回滚数据,保证数据回归至事务开始状态

2那么不同的隔离级别,隔离性是如何实现的,为什么不同事物间能够互不干扰? 答案是 锁 和 MVCC。

3持久性

基于事务的提交机制流程有可能出现三种场景

1 数据刷脏正常一切正常提交,Redo Log 循环记录数据成功落盘持久性得以保证

2数据刷脏的过程中出现的系统意外导致页断裂现象 (部分刷脏成功),针对页断裂情况,采用Double write机制进行保证页断裂数据的恢复

3数据未出现页断裂现象,也没有刷脏成功,MySQL通过Redo Log 进行数据的持久化即可

4一致性

从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性

2事务的隔离级别

Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别

脏读: 指一个事务读取了另外一个事务未提交的数据。

不可重复读: 在一个事务内读取表中的某一行数据,多次读取结果不同

虚读(幻读): 是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

2基本语法

-- 使用set语句来改变自动提交模式

SET autocommit = 0; /关闭/

SET autocommit = 1; /开启/

-- 注意:

--- 1MySQL中默认是自动提交

--- 2使用事务时应先关闭自动提交

-- 开始一个事务,标记事务的起始点

START TRANSACTION

-- 提交一个事务给数据库

COMMIT

-- 将事务回滚,数据回到本次事务的初始状态

ROLLBACK

-- 还原MySQL数据库的自动提交

SET autocommit =1;

-- 保存点

SAVEPOINT 保存点名称 -- 设置一个事务保存点

ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点

RELEASE SAVEPOINT 保存点名称 -- 删除保存点

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/

课堂测试题目

A在线买一款价格为500元商品,网上银行转账

A的yhk余额为2000,然后给商家B支付500

商家B一开始的yhk余额为10000

创建数据库shop和创建表account并插入2条数据

/

CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `shop`;

CREATE TABLE `account` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(32) NOT NULL,

`cash` DECIMAL(9,2) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`cash`)

VALUES('A',200000),('B',1000000)

-- 转账实现

SET autocommit = 0; -- 关闭自动提交

START TRANSACTION; -- 开始一个事务,标记事务的起始点

UPDATE account SET cash=cash-500 WHERE `name`='A';

UPDATE account SET cash=cash+500 WHERE `name`='B';

COMMIT; -- 提交事务

# rollback;

SET autocommit = 1; -- 恢复自动提交

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

3事务实现方式-MVCC

1什么是MVCC

MVCC是mysql的的多版本并发控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVVC。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别为RR(可重复读)和RC(读提交)生效。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突,极大的增加了系统的并发性能。

2MVCC的实现机制

InnoDB在每行数据都增加两个隐藏字段,一个记录创建的版本号,一个记录删除的版本号。

在多版本并发控制中,为了保证数据 *** 作在多线程过程中,保证事务隔离的机制,降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被 *** 作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的;对于数据的更新(包括增删改) *** 作成功,会将这个版本号更新到数据的行中;事务提交成功,新的版本号也就更新到了此数据行中。这样保证了每个事务 *** 作的数据,都是互不影响的,也不存在锁的问题。

3MVCC下的CRUD

SELECT:

当隔离级别是REPEATABLE READ时select *** 作,InnoDB每行数据来保证它符合两个条件:

1 事务的版本号 大于等于 创建行版本号

  2 行数据的删除版本 未定义 或者大于 事务版本号

  行创建版本号 事务版本号 行删除版本号

 

INSERT:

InnoDB为这个新行 记录 当前的系统版本号。

DELETE:

InnoDB将当前的系统版本号 设置为 这一行的删除版本号。

UPDATE:

InnoDB会写一个这行数据的新拷贝,这个拷贝的版本为 当前的系统版本号。它同时也会将这个版本号 写到 旧行的删除版本里。

————————————————

版权声明:本文为CSDN博主「@Autowire」的原创文章,遵循CC 40 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:>

解决方案之一,就是把你的所有 *** 作放在一个连接中执行完毕。mysql

-h${HOSTNAME}

-P${PORT}

-u${USERNAME}

-p${PASSWORD}

${DBNAME}

<

xsqlset

AUTOCOMMIT=0;start

transaction;在Xsql

中你可以写入语句。中间部分是一些数据库的 *** 作,如移表,删除等commit;

以上就是关于Mysql 中不commit也可以改变数据库吧,那么写不写commit命令有什么区别呢全部的内容,包括:Mysql 中不commit也可以改变数据库吧,那么写不写commit命令有什么区别呢、mysql数据库和oracle数据库的区别、MySQL数据库优化都包括哪些项目等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9814877.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存