目录
一、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=引擎