MYSQL索引,事物与存储引擎

  • 一,索引介绍
  • 1,索引的概念
  • (1)数据库索引
  • (2)索引的作用
  • 2,索引分类
  • 索引分为五类:
  • 3, 索引创建的方法
  • 1,普通索引
  • 2,唯一索引 (一个字段可建立多个索引)
  • 3,主键索引
  • 4,组合索引(单列索引与多列索引)
  • 4,全文索引
  • 5,删除索引
  • 5,扩展
  • (1)两张表之间建立内联:
  • (2)建立索引视图
  • 6,创建索引的原则依据
  • 二,事物介绍
  • 1,事物的概念
  • 2,事物的特点
  • 3,事物的控制语句
  • 4,事物的控制方法
  • 事物处理命令控制事物
  • 使用set 命令进行控制
  • 三,存储引擎
  • 1,存储引擎概念及相关介绍
  • 四,MyISAM
  • MyISAM不支持事务,也不支持外键
  • 访问速度快
  • 对事务完整性没有要求
  • MyISAM在磁盘上存储成三个文件
  • 表级锁定形式,数据在更新时锁定整个表
  • 数据库在读写过程中相互阻塞
  • 数据单独写入或读取,速度过程较快且占用资源相对少
  • MyISAM支持的存储格式
  • MyISAM适用的生产场景举例
  • 五,INNODB
  • 1、InnoDB特点介绍
  • 2, InnoDB适用生产场景分析
  • 3、企业选择存储引擎依据
  • 4,修改存储引擎


一,索引介绍

1,索引的概念

(1)数据库索引
  • 是一个排序的列表,存储着索引值和这个值所对应的物理地址
  • 无须对整个表进行扫描,通过物理地址就可以找到所需数据
  • 是表中一列或者若干列值排序的方法
  • 需要额外的磁盘空间
(2)索引的作用
  • 数据库利用各种快速定位技术,能够大大加快查询速率
  • 当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度
  • 可以降低数据库的IO成本,并且还可以降低数据库的排序成本
  • 通过创建唯一索引保证数据表数据的唯一性
  • 可以加快表与表之间的连接
  • 在使用分组和排序时,可大大减少分组和排序时间

2,索引分类

索引分为五类:

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

3, 索引创建的方法

  • 1,直接创建索引
  • 2,修改表结构方式添加索引
  • 3,创建表结构时创建索引
1,普通索引
  • 最基本的索引类型,没有唯一性之类的限制
  • 创建普通索引的方式
    例如以下三种索引的创建方式:
mysql> create table user0 (name char(64) not null,id int(5) not null,age int(3) not null,sex char(1) not null,index index_name(name));   //方法一为创建表时创建索引
Query OK, 0 rows affected (0.02 sec)
mysql> show keys from user0;   //查看已创建的索引
mysql> show index from user0;  //查看创建的索引
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user0 |          1 | index_name |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
mysql> alter table user0 add index index_age(age); //方法二,修改表时添加
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from user0;  //查看已经有两个索引存在
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user0 |          1 | index_name |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| user0 |          1 | index_age  |            1 | age         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)


mysql> create index index_id on user0(id); //方法三  直接创建
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from user0; 
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user0 |          1 | index_name |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| user0 |          1 | index_age  |            1 | age         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| user0 |          1 | index_id   |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

mysql>
2,唯一索引 (一个字段可建立多个索引)
  • 与 “普通索引”基本相同
  • 与普通索引的区别时索引列的所有值只能出现一次,即必须唯一(例如id)
  • 创建唯一索引的方式
    例如:
mysql> alter table user0 add unique index_aage(age);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show index from user0;
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user0 |          0 | index_aage |            1 | age         | A         |           4 |     NULL | NULL   |      | BTREE      |         |               |
| user0 |          1 | index_name |            1 | name        | A         |           4 |     NULL | NULL   |      | BTREE      |         |               |
| user0 |          1 | index_age  |            1 | age         | A         |           4 |     NULL | NULL   |      | BTREE      |         |               |
| user0 |          1 | index_id   |            1 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)
注:none值代表是0的话是唯一索引,如果是1 的话那就不是唯一索引
3,主键索引
  • 是一种特殊的唯一索引,指定为"primary key"
  • 一个表只能有一个主键,不允许有空值(指的是null);
    注:null 是占字符,显示为空,’’ 是不占字符,显示为空
  • 创建主键索引的方式,例如:
mysql> seletc * from school;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'seletc * from school' at line 1
mysql> select * from school;
+------+------+
| name | id   |
+------+------+
| lisi |    1 |
| NULL |    2 |
+------+------+
2 rows in set (0.00 sec)
mysql> update school set name='' where id='2';   //将其设为空
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from school;
+------+------+
| name | id   |
+------+------+
| lisi |    1 |
|      |    2 |
+------+------+
2 rows in set (0.00 sec)

mysql> alter table school add primary key(name);
Query OK, 0 rows affected (0.02 sec)    //添加成功
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into school values(NULL,3);  //说明不能为空指的是null
ERROR 1048 (23000): Column 'name' cannot be null    //不能改为null
mysql> show index from school;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| school |          0 | PRIMARY  |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| school |          1 | zuhe     |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| school |          1 | zuhe     |            2 | id          | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
4,组合索引(单列索引与多列索引)
  • 可以是单列上创建的索引,也可以是在多列上创建的索引
  • 最左原则,从左往右依次执行
  • 创建组合索引的方式,例如:
mysql> alter table school add index zuhe(name,id);  //添加组合键
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from school;  //查看组合键是否创建成功
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| school |          0 | PRIMARY  |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| school |          1 | zuhe     |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| school |          1 | zuhe     |            2 | id          | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

mysql> select * from school;   //普通查询
+------+------+
| name | id   |
+------+------+
|      |    2 |
| lisi |    1 |
+------+------+
2 rows in set (0.00 sec)

mysql> select id,name from school;  //利用组合键查询
+------+------+
| id   | name |
+------+------+
|    2 |      |
|    1 | lisi |
+------+------+
4,全文索引
  • MYSQL从3.23.23版开始支持全文索引和全文检索
  • 索引类型为fulltext
  • 可以在char,varchar或者text类型的列上创建
mysql> create fulltext index index_name_text on school (name);   //建立全文索引
Query OK, 0 rows affected, 1 warning (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> show index from school;  //方法一查看全文索引
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| school |          0 | PRIMARY         |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| school |          1 | zuhe            |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| school |          1 | zuhe            |            2 | id          | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| school |          1 | index_name_text |            1 | name        | NULL      |           2 |     NULL | NULL   |      | FULLTEXT   |         |               |
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)
mysql> show keys from school;方法二查看全文索引
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| school |          0 | PRIMARY         |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| school |          1 | zuhe            |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| school |          1 | zuhe            |            2 | id          | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| school |          1 | index_name_text |            1 | name        | NULL      |           2 |     NULL | NULL   |      | FULLTEXT   |         |               |
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.01 sec)
5,删除索引

删除索引有以下两种方式:

  • drop index 主键名 on 表名;
  • alter table 表名 drop index 主键名; 举例如下:
接上上一步,新建的表school中的索引删除如下:
mysql> drop index index_name_text on school; //方法一删除索引
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table school drop index zuhe;  //方法二删除索引
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show keys from school;   //查看两种方法的索引已删除
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| school |          0 | PRIMARY  |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
5,扩展
(1)两张表之间建立内联:
mysql> create table lhh1 (id int(10) not null auto_increment,name  varchar(64) not null,score int(3) not null, hobby int(2),primary key (id)); //创建比表lhh1
Query OK, 0 rows affected (0.01 sec) 
mysql> insert into lhh1 (name,score,hobby) values ('xiaoming',88,3),('xiaohua',98,2),('xiaoqiang','99',1);  //插入内容
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> create table lhh2 (id int(2) primary key,hob_name varchar(40)not null);    //创建表lhh2
Query OK, 0 rows affected (0.01 sec)
mysql> insert into lhh2 (id,hob_name) values (1,'看书'),(2,'聊天'),(3,'美术'); //插入内容
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0 
mysql> select * from lhh1 inner join lhh2 on lhh1.hobby=lhh2.id; //将lhh1与lhh2两张表建立内联
+----+-----------+-------+-------+----+----------+
| id | name      | score | hobby | id | hob_name |
+----+-----------+-------+-------+----+----------+
|  3 | xiaoqiang |    99 |     1 |  1 | 看书     |
|  2 | xiaohua   |    98 |     2 |  2 | 聊天     |
|  1 | xiaoming  |    88 |     3 |  3 | 美术     |
+----+-----------+-------+-------+----+----------+
3 rows in set (0.00 sec)
mysql> select lhh1.name,lhh2.hob_name from lhh1 inner join lhh2 on lhh1.hobby=lhh2.id;  //选择要查看的字段
+-----------+----------+
| name      | hob_name |
+-----------+----------+
| xiaoqiang | 看书     |
| xiaohua   | 聊天     |
| xiaoming  | 美术     |
+-----------+----------+
3 rows in set (0.00 sec)

注: 在选择要查看的字段时可以将表名进行简写,只写首字母即可
(2)建立索引视图
mysql> create view view_lhh1 as select lhh1.name,lhh2.hob_name from lhh1 lhh1 inner join lhh2 lhh2 on lhh1.hobby=lhh2.id;  //建立视图索引
Query OK, 0 rows affected (0.01 sec)

mysql> select * from view_lhh1;  //查看视图索引内容
+-----------+----------+
| name      | hob_name |
+-----------+----------+
| xiaoqiang | 看书     |
| xiaohua   | 聊天     |
| xiaoming  | 美术     |
+-----------+----------+
3 rows in set (0.00 sec)
mysql> insert into lhh1 (name,score,hobby) values ('zhangfei',72,2);  //在lhh1表中中添加字段
Query OK, 1 row affected (0.00 sec)  
mysql> mysql> select * from view_lhh1; //再次查看索引内容,已将刚才添加的内容映射到视图中
+-----------+----------+
| name      | hob_name |
+-----------+----------+
| xiaoming  | 美术     |
| xiaohua   | 聊天     |
| xiaoqiang | 看书     |
| zhangfei  | 聊天     |
+-----------+----------+
4 rows in set (0.00 sec)
6,创建索引的原则依据
  • 表的主键,外键必须有索引
  • 记录数超过300行的表应该有索引
  • 经常与其他表进行链接的表,在连接字段上应该建立索引
  • 唯一太差的字段不适合建立索引
  • 更新频繁的字段不适合创建索引
  • 经常出现在where子句中的字段,特别是大表的字段,应该建立索引
  • 索引应该建立在选择性高的字段上
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建立索引

二,事物介绍

1,事物的概念

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

2,事物的特点

  • 原子性
  • 事务是一个完整的操作,事务的个元素是不可分的
  • 事务中的所有元素必须作为一个整体提交或回滚
  • 如果事务中的任何元素失败,则整个事务将失败
  • 一致性
  • 当事务完成时,数据必须处于一致状态
  • 在事务开始前,数据库中存储的数据处于一致状态
  • 在正在进行的事务中,数据可能处于不一致的状态
  • 当事务成功完成时,数据必须再次回到已知的一致状态
  • 隔离性
  • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
  • 持久性
  • 指不管系统是否发生故障,事务处理的结果都是永久的
  • 一旦事务被提交,事务的效果会被永久地保留在数据库中

3,事物的控制语句

  • MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交
  • 事务控制语句
    BEGIN或START TRANSACTIONCOMMITROLLBACKSAVEPOINT identifierRELEASE SAVEPOINT identifierROLLBACK TO identifierSET TRANSACTION

4,事物的控制方法

事物处理命令控制事物

BEGIN:开始一个事务
COMMIT:提交一个事务
ROLLBACK:回滚一个事务
例如:

mysql> select * from lhh1;  // 原表内容如下
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  1 | xiaoming  |    88 |     3 |
|  2 | xiaohua   |    98 |     2 |
|  3 | xiaoqiang |    99 |     1 |
|  4 | zhangfei  |    72 |     2 |
+----+-----------+-------+-------+
4 rows in set (0.01 sec)

mysql> begin;   //开始一个事物
Query OK, 0 rows affected (0.00 sec)
mysql> insert into lhh1 values(5,'lihuahua',80,5);  //插入第一条内容
Query OK, 1 row affected (0.00 sec)
mysql> select * from lhh1;   //在root账户下插入之后不用提交自动保存
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  1 | xiaoming  |    88 |     3 |
|  2 | xiaohua   |    98 |     2 |
|  3 | xiaoqiang |    99 |     1 |
|  4 | zhangfei  |    72 |     2 |
|  5 | lihuahua  |    80 |     5 |
+----+-----------+-------+-------+
5 rows in set (0.00 sec)

mysql> commit;     //提交,这里如果不提交的话,在另外一个账户下登录是看不了的,只能在本次操作的用户下看得到
Query OK, 0 rows affected (0.01 sec)
mysql> exit;      //退出root账户
Bye
[root@server1 ~]# mysql -u liming -p  //登录另外一账户liming
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql> use aaa;
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 lhh1;  //提交之久可以在Liming账户下看得到
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  1 | xiaoming  |    88 |     3 |
|  2 | xiaohua   |    98 |     2 |
|  3 | xiaoqiang |    99 |     1 |
|  4 | zhangfei  |    72 |     2 |
|  5 | lihuahua  |    80 |     5 |
+----+-----------+-------+-------+
5 rows in set (0.00 sec)
注:commit提交之后表示一个事物已经结束,如果还需重新开始则需要begin重新开始

mysql> begin;   //再重新开始一个事物
Query OK, 0 rows affected (0.00 sec)
mysql> insert into lhh1 values(6,'linana',80,6);  //插入第一个内容
Query OK, 1 row affected (0.00 sec)

mysql> savepoint a;  //将此状态定义为a
Query OK, 0 rows affected (0.00 sec)

mysql> insert into lhh1 values(7,'likaikai',90,9);   //定义之后再插入第二个数据
Query OK, 1 row affected (0.00 sec)

mysql> insert into lhh1 values(8,'liji',99,6);  //插入第三个数据
Query OK, 1 row affected (0.00 sec)

mysql> savepoint b;   //将此状态定义为b
Query OK, 0 rows affected (0.00 sec)

mysql> select * from aaa.lhh1;   //此时查看a,b状态插入的三个数据
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  1 | xiaoming  |    88 |     3 |
|  2 | xiaohua   |    98 |     2 |
|  3 | xiaoqiang |    99 |     1 |
|  4 | zhangfei  |    72 |     2 |
|  5 | lihuahua  |    80 |     5 |
|  6 | linana    |    80 |     6 |
|  7 | likaikai  |    90 |     9 |
|  8 | liji      |    99 |     6 |
+----+-----------+-------+-------+
8 rows in set (0.00 sec)

mysql> insert into lhh1 values(9,'lhuhui',99,6);  //再插入第四个数据
Query OK, 1 row affected (0.00 sec)
mysql> select * from aaa.lhh1;
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  1 | xiaoming  |    88 |     3 |
|  2 | xiaohua   |    98 |     2 |
|  3 | xiaoqiang |    99 |     1 |
|  4 | zhangfei  |    72 |     2 |
|  5 | lihuahua  |    80 |     5 |
|  6 | linana    |    80 |     6 |
|  7 | likaikai  |    90 |     9 |
|  8 | liji      |    99 |     6 |
|  9 | lhuhui    |    99 |     6 |
+----+-----------+-------+-------+
9 rows in set (0.00 sec)

mysql> rollback to b;  // 回滚到状态b
Query OK, 0 rows affected (0.00 sec)

mysql> select * from aaa.lhh1;  //查看在b状态之后创建的数据已不在
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  1 | xiaoming  |    88 |     3 |
|  2 | xiaohua   |    98 |     2 |
|  3 | xiaoqiang |    99 |     1 |
|  4 | zhangfei  |    72 |     2 |
|  5 | lihuahua  |    80 |     5 |
|  6 | linana    |    80 |     6 |
|  7 | likaikai  |    90 |     9 |
|  8 | liji      |    99 |     6 |
+----+-----------+-------+-------+
8 rows in set (0.00 sec)

mysql> rollback to a;  //回滚到状态a
Query OK, 0 rows affected (0.00 sec)

mysql> select * from aaa.lhh1;  //状态b插入的数据已不在
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  1 | xiaoming  |    88 |     3 |
|  2 | xiaohua   |    98 |     2 |
|  3 | xiaoqiang |    99 |     1 |
|  4 | zhangfei  |    72 |     2 |
|  5 | lihuahua  |    80 |     5 |
|  6 | linana    |    80 |     6 |
+----+-----------+-------+-------+
6 rows in set (0.00 sec)

mysql> rollback;   // 回滚到初始状态
Query OK, 0 rows affected (0.01 sec)

mysql> select * from aaa.lhh1;  //此时显示的是表还未修改的原表
+----+-----------+-------+-------+
| id | name      | score | hobby |
+----+-----------+-------+-------+
|  1 | xiaoming  |    88 |     3 |
|  2 | xiaohua   |    98 |     2 |
|  3 | xiaoqiang |    99 |     1 |
|  4 | zhangfei  |    72 |     2 |
|  5 | lihuahua  |    80 |     5 |
+----+-----------+-------+-------+
5 rows in set (0.00 sec)

mysql> commit;   //提交之后改事物结束
Query OK, 0 rows affected (0.00 sec)

解释:事物适用于正在编辑但还未保存的情况,如果后续编辑有错,可以在建立的状态中回滚到以前的初始状态,类似linux操作系统的快照功能。区别在于只能一步一步回滚,不能跳状态回滚。

使用set 命令进行控制

set autocommit=0:禁止自动提交
set autocommit=1:开启自动提交

三,存储引擎

1,存储引擎概念及相关介绍

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

四,MyISAM

MyISAM不支持事务,也不支持外键
访问速度快
对事务完整性没有要求
MyISAM在磁盘上存储成三个文件
  • 1 ,frm文件存储表定义
  • 2 ,数据文件的扩展名为.MYD(MYDATA)
  • 3 ,索引文件的扩展名是.MYI(MYIndex)
表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞
  • 1、会在数据写入的过程阻塞用户数据的读取
  • 2、也会在数据读取的过程中阻塞用户的数据写入
数据单独写入或读取,速度过程较快且占用资源相对少
MyISAM支持的存储格式
  • 1、静态表
  • 2、动态表
  • 3、压缩表
MyISAM适用的生产场景举例
  • 1、公司业务不需要事务的支持
  • 2、单方面读取或写入数据比较多的业务
  • 3、MyISAM存储引擎数据读写都比较频繁场景不适合
  • 4、使用读写并发访问相对较低的业务
  • 5、数据修改相对较少的业务
  • 6、对数据业务一致性要求不是非常高的业务
  • 7、服务器硬件资源相对比较差

五,INNODB

1、InnoDB特点介绍

  • 1、支持4个事务隔离级别
  • 2、行级锁定,但是全表扫描仍然会是表级锁定
  • 3、读写阻塞与事务隔离级别相关
  • 4、能非常高效的缓存索引和数据
  • 5、表与主键以簇的方式存储
  • 6、支持分区、表空间、类似Oracle数据库
  • 7、支持外键约束,5.5前不支持全文索引,5.5后支持全文索引
  • 8、对硬件资源要求还是比较高的场合

2, InnoDB适用生产场景分析

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

3、企业选择存储引擎依据

  • 1、需要考虑每个存储引擎提供的核心功能及应用场景
  • 2、支持的字段和数据类型
  • 所有引擎都支持通用的数据类型
  • 但不是所有的引擎都支持其它的字段类型,如二进制对象
  • 3、锁定类型:不同的存储引擎支持不同级别的锁定
  • 表锁定
  • 行锁定
  • 4、索引的支持
  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能
  • 不同的存储引擎提供不同的制作索引的技术
  • 有些存储引擎根本不支持索引
  • 5、事务处理的支持
  • 提高在向表中更新和插入信息期间的可靠性
  • 可根据企业业务是否要支持事务选择存储引擎

4,修改存储引擎

  • 方法一:alter table修改
    mysql> alter table 库名 engine=MyISAM;
mysql> show create table school;
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                           |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| school | CREATE TABLE `school` (
  `name` char(64) NOT NULL DEFAULT '',
  `id` int(5) DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter table school engine=myisam;
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> show create table school;
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                           |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| school | CREATE TABLE `school` (
  `name` char(64) NOT NULL DEFAULT '',
  `id` int(5) DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
  • 方法二:修改my.cnf配置文件,指定默认存储引擎并重启服务
    vim my.cnfdefault-storage-engine=InnoDB
进入vi /etc/my.cnf
加一条 default=storage-engine=MySAM;
之后重启Mysql
验证有无生效:
mysql> create table bbb.ccc(id int(2));  //创建表ccc查看存储引擎已生效
Query OK, 0 rows affected (0.00 sec)

mysql> show create table ccc;
+-------+--------------------------------------------------------------------------------------+
| Table | Create Table                                                                         |
+-------+--------------------------------------------------------------------------------------+
| ccc   | CREATE TABLE `ccc` (
  `id` int(2) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
  • 方法三:create table创建表时指定存储引擎
    mysql> create table engine Test(id int) engine=MyISAM; 例如:
mysql> create table abc (id int(1))engine=InnoDB;
Query OK, 0 rows affected (0.00 sec)

mysql> show create table bbb.abc;
+-------+--------------------------------------------------------------------------------------+
| Table | Create Table                                                                         |
+-------+--------------------------------------------------------------------------------------+
| abc   | CREATE TABLE `abc` (
  `id` int(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
  • 方法四 Mysql_convert_table_format 转化存储引擎
[root@server1 ~]# yum -y install perl-DBD-MySQL -y
[root@server1 ~]# /usr/local/mysql/bin/mysql_convert_table_format --user=root --password='123456' --sock=/tmp/mysql.sock auth