Mysql数据库事务

目录

一、Mysql数据库事务的概念

1.事务的定义

2.事务的特点

2.1原子性

2.2一致性

2.3隔离性

2.4持久性

3.事务之间的相互影响

3.1脏读

3.2不可重复读

3.3幻读

3.4丢失更新

4.如何解决事务的干扰

4.1read uncommitted——读取尚未提交的数据

4.2read committed——提交读

4.3repeatable read——可重复读

4.4serializable——串行

5.事务隔离级别操作

5.1查询全局事务隔离级别

5.2查询当前会话隔离级别

5.3设置全局事务隔离级别

5.4设置当前会话隔离级别

6.事务控制语句

6.1开始与提交事务

6.2测试回滚事务

6.3测试多点回滚事务

6.4使用set设置控制事务

二、存储引擎

1.存储引擎概念介绍

2.Mysql常用的存储引擎

2.1MyISAM介绍

2.2MyISAM支持的存储格式

2.2.1静态表(固定长度表)

2.2.2动态表

2.2.3压缩表

2.3场景举例

3.InnoDB

3.1场景举例

3.2企业选择存储引擎依据

4.查看存储引擎

 ​编辑

5.修改存储引擎

5.1直接修改修——alter table

5.2修改my.cnf配置文件

5.3创建表时指定引擎——create table

三、总结

1.索引的概念及适用场景

2.索引的配置方法

3.事务的特点及原则

4.配置事务的方法

5.主流的存储引擎技术

6.查看和修改存储引擎的方法

6.1查看引擎

6.2修改引擎


一、Mysql数据库事务的概念

1.事务的定义

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中, 要删除一个人员,即需要删除人员的基本资料,又需要删除和该人员相关的信息,如信箱, 文章等等。这样,这些数据库操作语句就构成一个事务

  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。
  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
  • 事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。
  • 事务通过事务的整体性以保证数据的一致性。
  • 事务能够提高在向表中更新和插入信息期间的可靠性。

事务的存在可以确保数据操作的正确性和可靠性,保证数据在操作过程中不会出现异常或错误。

2.事务的特点

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。

  • A:atomicity 原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
  • C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态,类似于质量守恒定律(A1wB 0 A1w 给 B转1w 始终保持A+B=1w)
  • I: Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发.(不最后提交看不到,脏数
  • D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中

2.1原子性

指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

  • 事务是一个完整的操作,事务的各元素是不可分的。
  • 事务中的所有元素必须作为一个整体提交或回滚。
  • 如果事务中的任何元素失败,则整个事务将失败。

2.2一致性

指在事务开始之前和事务结束以后,数据库从一个一致状态转换到另一个状态,数据库的完整性约束和准确性没有被破坏。

  • 当事务完成时,数据必须处于一致状态。
  • 在事务开始前,数据库中存储的数据处于一致状态。
  • 在正在进行的事务中,数据可能处于不一致的状态。
  • 当事务成功完成时,数据必须再次回到已知的一致状态。

2.3隔离性

指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

  • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

2.4持久性

在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚,即使系统发生故障或重启,修改的数据也不会丢失。

  • 指不管系统是否发生故障,事务处理的结果都是永久的。
  • 一旦事务被提交,事务的效果会被永久地保留在数据库中。
     

3.事务之间的相互影响

一个事务的执行不能被其他事务干扰,事务之间的相互影响分为

  • 脏读
  • 不可重复读
  • 幻读
  • 丢失更新

3.1脏读

脏读(读取未提交的数据):脏读指的是读到了其他事务未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并不一定最终存在的数据,这就是脏读。

举例:事务A在处理数据库数据,修改了数据,但是未提交事务,事物B读取了数据,事务A数据发生了回滚,这样事务B就形成了脏读。也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

3.2不可重复读

不可重复读(前后多次读取,数据内容不一致)一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

举例:事务A操作数据库,读取了数据库内容,事务B修改数据事务之后,提交了事务,事务A第二次查询读取数据库内容,但是数据内容发生了变化,这就是不可重复读。

3.3幻读

幻读(前后多次读取,数据总量不一致):一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时另一个事物也修改了这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有未修改的数据行,就好像发生了幻觉一样。

举例:事务B操作数据库,读取数据库内的数据,事务A操作数据库,对事务进行了修改,并提交了事务,事务B第二次读取数据库内的内容的时候,读取到的数据总量发生了变化,那么这个就是幻读。

3.4丢失更新

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果

举例:此时需要添加数据信息,事务A和事务B都不知道对方是否要添加这条新增的数据信息,所以事务A和事务B都同时新增了数据信息(实际上只增加一条数据即可),事务A已经修改创建了数据,事务B又修改创建了数据,那么最终的数据信息会多两条。

4.如何解决事务的干扰

4.1read uncommitted——读取尚未提交的数据

允许脏读,其他事务只要修改了数据但未提交数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交的事务修改的数据。

安全性最差,但性能最好(不建议使用)

4.2read committed——提交读

读取已经提交的数据,可以解决脏读,只能读取到已经提交的数据,Oracle等多数数据库默认都是该级别

数据的插入、更新、查询  只要事务不结束,所有用户读取的数据都是源数据

安全性较差,性能较好(Oracle数据库默认)

4.3repeatable read——可重复读

重复读取,可以解决脏读和不可重复读,是Mysql数据库默认的读取方式。无论其他事务是否修尬并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。

安全性较高,性能较差(Mysql数据库默认)

4.4serializable——串行

可以解决脏读、不可重复读和虚读(幻读),相当于锁表

一张表同时只有一个人可以操作,下次如果想修改数据内容,需要等当前这个人操作完成后才可以

完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

安全性高,性能差,不建议使用

Mysql默认的事务处理级别是repeatable read;

Oracle和SQL Server默认的事物处理级别是read committed

事务隔离级别的作用范围分为两种

  • 全局级:对所有会话有效
  • 会话级:只对当前的会话有效

全局级是指无论在哪个终端对当前数据库进行操作的称之为全局;

会话级是指在当前会话(当前用户终端)对数据库进行操作的称之为会话级。

事务隔离级别脏读不可重复读幻读第一类丢失更新(回滚)第二类丢失更新(覆盖)
read uncommitted允许允许允许禁止允许
read committed禁止允许允许禁止允许
repeatable read禁止禁止允许禁止禁止
seriallzable禁止禁止禁止禁止禁止

 丢失更新分为两类。第一类丢失更新:回滚丢失;第二类丢失更新:覆盖丢失。SQL92没有定义这种现象,标准定义的所有隔离级别都不允许第一类丢失更新发生。
解决丢失更新的办法就是加锁

5.事务隔离级别操作

5.1查询全局事务隔离级别

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.00 sec)

Mysql默认的事务隔离级别是可重复读repeatable read 

5.2查询当前会话隔离级别

mysql> show session variables like '%isolation%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.16 sec)

5.3设置全局事务隔离级别

mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-COMMITTED        |
+-----------------------+
1 row in set (0.00 sec)

5.4设置当前会话隔离级别

mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

mysql> show session variables like '%isolation%';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| tx_isolation  | READ-COMMITTED |
+---------------+----------------+
1 row in set (0.00 sec)

6.事务控制语句

  • Begin 或 Start transaction 显示地开始一个事务
  • Commit 或 Commit work 提交事务,并使已对数据库进行的所有修改变为永久性
  • Rollback 或 Rollback work 回滚回结束用户的事务,并撤销正在进行的所有未提交的修改
  • Savepoint S1 使用Savepoint 允许在事务中创建一个回滚点,一个事务中可以有多个回滚点(S1代表回滚点)
  • Rollback to savepoint S1 把事务回滚到标记点

6.1开始与提交事务

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show session variables like '%isolation%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.01 sec)

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.00 sec)
mysql> create database school_class;
Query OK, 1 row affected (0.00 sec)

mysql> use school_class;
Database changed
mysql> create table class(id int primary key not null,name varchar(8),money double);
Query OK, 0 rows affected (0.01 sec)

mysql> desc class;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | NO   | PRI | NULL    |       |
| name  | varchar(8) | YES  |     | NULL    |       |
| money | double     | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into class values(1,'wuyq',1000);
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(2,'fangwl',1000);
Query OK, 1 row affected (0.01 sec)

mysql> select * from class;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |  1000 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> begin;
#开启事务
Query OK, 0 rows affected (0.00 sec)

mysql> update class set money=money - 100 where id=1;
#事务状态时  更新数据 数据表class 字段列money id为1的用户信息 money减少100
Query OK, 1 row affected (0.11 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from class;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |   900 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)
mysql> use school_class;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from class;
#事务B介入  此时查看class数据表  还是原始数据
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |  1000 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)
mysql> commit;
#事务A提交事务
Query OK, 0 rows affected (0.00 sec)
mysql> select * from class;
#事务B查看class数据表  此时数据发生变化
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |   900 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

6.2测试回滚事务

mysql> begin;
#开启事务
Query OK, 0 rows affected (0.00 sec)

mysql> update class set money=money + 100 where name='fangwl';
#更新事务状态下的class数据表中的数据
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from class;
#数据发生变化
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |   900 |
|  2 | fangwl |  1100 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
#回滚到最初始的状态
Query OK, 0 rows affected (0.00 sec)

mysql> select * from class;
#最初始状态
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |   900 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> commit;
#终止事务
Query OK, 0 rows affected (0.00 sec)

6.3测试多点回滚事务

mysql> begin;
#开启事务
Query OK, 0 rows affected (0.00 sec)

mysql> select * from class;
#此时状态是事务状态下的数据内容
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |   900 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> update class set money = money - 100 where name='wuyq';
#修改class数据表  修改money列 将name条件为wuyq的字段的money信息修改-100
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from class;
#事务修改后的数据信息
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |   800 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> savepoint S1;
#做一个可回滚点S1
Query OK, 0 rows affected (0.00 sec)

mysql> select * from class;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |   800 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> update class set money = money + 500 where name='wuyq';
#修改class数据表  修改money列 将name条件为wuyq的字段的money信息修改+500
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from class;
#事务修改后的数据信息
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |  1300 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> savepoint S2;
#做一个可回滚点S2
Query OK, 0 rows affected (0.00 sec)

mysql> select * from class;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |  1300 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

mysql> rollback to S1;
#回滚到S1可回滚点
Query OK, 0 rows affected (0.00 sec)

mysql> select * from class;
+----+--------+-------+
| id | name   | money |
+----+--------+-------+
|  1 | wuyq   |   800 |
|  2 | fangwl |  1000 |
+----+--------+-------+
2 rows in set (0.00 sec)

6.4使用set设置控制事务

  • SET AUTOCOMMIT=0;           #禁止自动提交
  • SET AUTOCOMMIT=1;           #开启自动提交,Mysql默认为1
  • SHOW VARIABLES LIKE 'AUTOCOMMIT';        #查看Mysql中的AUTOCOMMIT值

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
当然无论开启与否,begin; commit|rollback; 都是独立的事务。

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

二、存储引擎

1.存储引擎概念介绍

  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
  • Mysql数据库中的组件,负责执行实际的数据I/O操作
  • Mysql系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储 

数据的存储是以特殊格式方式来保存的,存储引擎是在磁盘前的,存储引擎主要是将需要存储的数据转化为相应的格式,最后存储在磁盘上 

2.Mysql常用的存储引擎

  • MyISAM
  • InnoDB

2.1MyISAM介绍

  • MyISAM不支持事务,也不支持外键,只支持全文索引,数据文件和索引文件是分开保存的
  • 访问速度快
  • 对事务完整性没有要求

外键:关联两个表,将子表和主表做关联;

对事务完整性没有要求:无论存储什么事务都能接收。

MyISAM在磁盘上存储三个文件

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

创建表的时候会自动生成一个frm结尾的文件

[root@localhost mysql]#pwd
/usr/local/mysql/data/mysql

表级锁定形式,数据在更新时锁定整个表

当一个人在操作数据库操作数据的时候,所有人都不可以操作数据表;

MyISAM是表级锁定,读或写无法同时进行;好处是分开执行时,速度快,资源占用相对较少

数据库在读写过程中相互阻塞

  • 会在数据写入的过程阻塞用户数据的读取
  • 也会在数据读取的过程中阻塞用户的数据写入

数据库在读写过程中相互阻塞,实际上就是串行 

数据单独写入或读取,速度过程较快且占用资源相对少

2.2MyISAM支持的存储格式

  • 静态表
  • 动态表
  • 压缩表
2.2.1静态表(固定长度表)

静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的。

  • 优点是存储非常迅速,容易缓存,出现故障容易恢复
  • 缺点是占用的空间通常比动态表多

静态表占用大量的磁盘空间;如果需要存储稳定的话,建议使用静态表

2.2.2动态表

动态表包含可变字段(varchar),记录不是固定长度的。

  • 优点是占用空间较少
  • 缺点是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。

optimize table语句或myisamchk -r命令是清除碎片常用的命令;如果是容量小,建议使用动态表

2.2.3压缩表

压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

2.3场景举例

  • 公司业务不需要事务的支持 
  • 单方面读取或写入数据比较多的业务
  • MyISAM存储引擎数据读写都比较频繁场景不适合
  • 使用读写并发访问相对较低的业务
  • 数据修改相对较少的业务
  • 对数据业务一致性要求不是非常高的业务
  • 服务器硬件资源相对比较差

MyISAM适合于单方向的任务场景,同时并发量不高,对于事务要求不高的场景;

适合查询、插入为主的应用场景

日志文件不是事务

3.InnoDB

  • 支持事务,支持4个事务隔离级别(数据不一致问题)
  • 读写阻塞与事务隔离级别相关
  • 能非常高效的缓存索引和数据
  • 表与主键以簇的方式存储
  • 支持分区、表空间,类似oracle数据库
  • 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
  • 对硬件资源要求还是比较高的场合

表空间是Oracle数据库的数据库名字;

对于自增长的字段,InnoDB 中必须包含只有该字段的索引

3.1场景举例

  • 业务需要事务的支持
  • 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
  • 业务数据更新较为频繁的场景(论坛、微博)
  • 业务数据一致性要求较高(银行业务)
  • 硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力

3.2企业选择存储引擎依据

需要考虑每个存储引擎提供的核心功能及应用场景

  • 如果读写的并发量大,建议使用InnoDB
  • 如果单独的写入或是插入单独的查询,建议使用MyISAM

支持的字段和数据类型

  • 所有引擎都支持通用的数据类型
  • 但不是所有的引擎都支持其他的字段类型,如二进制对象

锁定类型:不同的存储引擎支持不同级别的锁定

  • 表锁定
  • 行锁定

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;

索引的支持

  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能
  • 不同的存储引擎提供不同的制作索引的技术
  • 有些存储引擎根本不支持索引

事务处理的支持

  • 提高在向表中更新和插入信息期间的可靠性    
  • 可根据企业业务是否要支持事务选择存储引擎  innodb

可靠性使用MyISAM;Mysql数据库默认使用InnoDB 

4.查看存储引擎

show engines

 show table status from 库名 where name='表名'\G

 

5.修改存储引擎

5.1直接修改修——alter table

alter table tablename engine=引擎

mysql> alter table class engine=myisam;
Query OK, 4 rows affected (0.20 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> show create table class;


| class | CREATE TABLE "class" (
  "id" int(11) NOT NULL,
  "name" char(8) DEFAULT NULL,
  "grade" decimal(4,2) DEFAULT NULL,
  "remark" text,
  "address" char(20) DEFAULT NULL,
  "phone" char(11) DEFAULT NULL,
  "cardid" int(11) DEFAULT NULL,
  UNIQUE KEY "address_index" ("address"),
  FULLTEXT KEY "remark_index" ("remark")
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

5.2修改my.cnf配置文件

default-storage-engine=InnoDB

[root@localhost mysql]#vim /etc/my.cnf
[root@localhost mysql]#sed -n '23p' /etc/my.cnf
default-storage-engine=MyISAM
[root@localhost mysql]#systemctl restart mysqld
mysql> create table class2 (id int not null,name char(8),address varchar(20)); 
Query OK, 0 rows affected (0.00 sec)

mysql> show create table class2;

| class2 | CREATE TABLE "class2" (
  "id" int(11) NOT NULL,
  "name" char(8) DEFAULT NULL,
  "address" varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。 一般不建议使用此方法,因为数据库不会随意重启

5.3创建表时指定引擎——create table

create table tablename (字段) engine=引擎

mysql> create table class3 (id int,name char(6)) engine=innodb;
Query OK, 0 rows affected (0.00 sec)

mysql> show create table class3;


| class3 | CREATE TABLE "class3" (
  "id" int(11) DEFAULT NULL,
  "name" char(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

三、总结

1.索引的概念及适用场景

  • 索引是为了加速访问,便于客户端获取数据,提升了客户的体验
  • 索引减少了Mysql数据库的压力

2.索引的配置方法

  • 普通索引
  • 唯一索引
  • 主键索引
  • 组合索引
  • 全文索引

索引可以直接创建索引,可以修改表结构的方式进行索引,也可以在创建表的时候指定索引 

3.事务的特点及原则

  • 原子性:要么都执行,要么都不执行
  • 一致性:要求事务前后数据的完整和一致
  • 持久性:要求多个事务之间不相互影响依赖
  • 隔离性:当事务提交后将永久保存,不可再回滚

4.配置事务的方法

  • Begin 或 Start transaction 显示地开始一个事务
  • Commit 或 Commit work 提交事务,并使已对数据库进行的所有修改变为永久性
  • Rollback 或 Rollback work 回滚回结束用户的事务,并撤销正在进行的所有未提交的修改
  • Savepoint S1 使用Savepoint 允许在事务中创建一个回滚点,一个事务中可以有多个回滚点(S1代表回滚点)
  • Rollback to savepoint S1 把事务回滚到标记点

5.主流的存储引擎技术

  • MyISAM  Mysql数据库可以指定的存储引擎
  • InnoDB   Mysql数据库默认

MyISAM和InnoDB区别

  • InnoDB支持事务,而MyISAM不支持事务
  • InnoDB支持行级锁,而MyISAM支持表级锁
  • InnoDB支持MVCC,MyISAM不支持
  • InnoDB支持外键,而MyISAM不支持
  • InnoDB支持全文索引,而MyISAM只支持全文索引

6.查看和修改存储引擎的方法

6.1查看引擎

  • show engines
  •  show table status from 库名 where name='表名'\G

6.2修改引擎

  • alter table tablename engine=引擎
  • default-storage-engine=InnoDB
  • create table tablename (字段) engine=引擎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/479110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ros time 时间戳改为机器开机时间

一、问题描述 因项目需要,需要"ros::Time::now()" 改成获取机器开机时间,此处针对rospy的机器时间修改。 二、修改方法 修改ros源码的文件 /opt/ros/noetic/lib/python3/dist-packages/rospy/rostime.py 修改如下: 定位到 get_rostime() ,并将 float_…

面试笔记——MySQL(事务:事务特性、并发事务、事务隔离、Redo Log与Undo Log、MVCC)

事务 概念与特性 事务(Transaction)指的是一组数据库操作,这些操作要么全部成功执行,要么全部不执行,保证了数据库的一致性和完整性,它使得数据库操作可以按照逻辑上的单元进行组织和执行,提高…

视频号小店入口在哪?怎么运营?全流程分享!

我是电商珠珠 视频号小店是视频号在22年7月宣布的电商平台,是供商家做店所使用。到现在也发展了不过一年的时间,所以有很多商家都想要往这个平台上转,其中包括新手。因为这个平台属于初期,所以红利比较大,规则限制没有…

CDMP认证是一个什么样的证书?有必要参加CDMP培训吗?通过率高不高?

在当前数字化时代,数据管理变得愈发重要。为了满足社会对数据管理人才的紧迫需求,DAMA国际于2004年推出了CDMP数据管理专业认证。这是一项综合资格认证,涵盖学历教育、工作经验和专业知识考试。CDMP认证是全球唯一的数据管理方面权威性认证&a…

[Rust] 使用vscode实现HelloWorld程序并进行debug

一、简介 本文介绍了如何使用vscode编写rust,实现打印"Hello, world!"的程序。 二、工具安装 0. 环境介绍: Linux (或者windowswsl) 1. 安装rust编译器rustc和包管理器cargo。 请参考连接:Rust 程序设…

wy的leetcode刷题记录_Day92

wy的leetcode刷题记录_Day92 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2024-3-22 前言 目录 wy的leetcode刷题记录_Day92声明前言2617. 网格图中最少访问的格子数题目介绍思路代码收获 695. 岛屿的最大面积题目介绍思路代码收获 2…

java网络原理(二)------TCP确认应答和超时重传

一Tcp协议 TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。 二.TCP协议段格式 知道了端口号才能进一步确认这个数据报交给了哪一个程序。16为端口号是2字节,范围是0到65535.如…

牛,The O-one ——通过语音交互控制电脑的开源语言模型

模型介绍 The O-one :一个创新的开源语言模型计算机 可以让你通过语音交互来和你的计算机进行对话,完成询问、指令下达等任务。灵感居然来自Andrej Karpathy 的 LLM 操作系统。O1运行一个代码解释语言模型,并在计算机内核发生特定事件时调用…

音视频开发_FFmpeg基石精讲

FFmpeg 框架 核心组件 libavcodec:一个编解码库,包含了众多的编码器和解码器用于编码和解码音视频流。libavformat:一个封装格式库,用于处理各种音视频封装格式。libavutil:一个工具库,提供了常见功能的简…

交互式QGraphicsView(平移/缩放/旋转)

一 简述 Graphics View提供了一个平台,用于大量自定义 2D 图元的管理与交互,框架包括一个事件传播架构,支持场景 Scene 中的图元 Item 进行精确的双精度交互功能。Item 可以处理键盘事件、鼠标按下、移动、释放和双击事件,同时也…

SAP-MM-设置字段默认值

当我们创建订单时,有些字段总是重复输入,每次值也是固定的,例如生产订单 如上图“生产工厂都是1000”如何设置成默认每次进入都是1000呢? 点击字段,F1 查看参数ID“WRK” 输入tcode:SU3 按上图维护数据100…

Quartz完全开发手册(一篇学会Quartz所有知识点)

目录 一、Quartz概念 1.1、Quartz介绍 1.2、使用场景 1.3、特点 二、Quartz运行环境 三、Quartz设计模式 四、Quartz学习的核心概念 4.1、任务Job 4.2、触发器Trigger 4.3、调度器Scheduler 五、Quartz的体系结构与工作流程 5.1、体系结构 5.2、工作流程 六、Quar…

Python Flask框架 -- 模版继承

一个网站中,大部分网页的模块是重复的,比如顶部的导航栏,底部的备案信息。如果在每个页面中都重复的去写这些代码,会让项目变得臃肿,提高后期维护成本。比较好的做法是,通过模板继承,把一些重复…

SpringBoot-04 | spring-boot-starter-logging原理原理

SpringBoot-04 | spring-boot-starter-logging原理原理 第一步:springboot加载factories文件第二步:构造监听器第三步:注册监听器到Spring中第四步:开始加载日志框架第五步:加载日志框架logback-spring.xml第六步&…

全域电商数据实现高效稳定大批量采集♀

全域电商,是近几年的新趋势,几乎所有商家都在布局全域,追求全域增长。但商家发现,随着投入成本的上涨,利润却没有增加。 其中最为突出的是——商家为保证全域数据的及时更新,通过堆人头的方式完成每日取数任…

【应用笔记】LAT1305+使用STM32+TT类型IO的注意事项

1. 概述 在 STM32 系列 MCU 中, 除了一些特殊管脚外,绝大多数管脚都可以分类为 FT (兼容5V 信号)或 TT(兼容 3V3 信号)类型的 IO,由于 MCU 内部设计的不同, TT IO 相比 5V IO 有更多的限制,下面…

I2C协议

一.硬件连接 I2C必须使用开漏(或集电极开路)的引脚,其引脚框图如下所示。 SCL0对应78K0的P6.0引脚,SDA0对应78K0的P6.1引脚。 在使用开漏引脚通信时,需注意如下事项: 1)两条总线须外接…

国产之光?Kimichat大模型200万字超长上下文突破

Kimi Chat简介 Kimi是AI大模型初创企业月之暗面(Moonshot)推出的AI产品。近日月之暗面宣布Kimi 智能助手在长上下文窗口技术上再次取得突破,无损上下文长度提升了一个数量级到200万字。 月之暗面(Moonshot AI)&#…

保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)【持续更新最新版】-CSDN博客 1.简介 有的小伙伴或者童鞋们可能会好奇地问,不是讲解和分享抓包…

CI/CD实战-jenkins部署 3

安装 软件下载地址:Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 启动服务 安装推荐插件 不新建用户,使用admin账号登录 修改一下初始密码 新建项目测试 安装git命令 生成密钥 在gitlab中上传公钥 修改ssh 创建中…