本部分是MySQL的相关特性介绍。

一、MySQL存储引擎简介

  • 存储引擎是通过采用不同的技术将数据存储在文件或内存中,不同的技术有不同的存储机制,其功能和能力也不同,通过选择不同的技术,可以获得特殊的速度或功能,从而提高应用的性能。存储引擎是MySQL特有的
  • 在不同的业务场景下选择不同的存储引擎,这样能够发挥MySQL的最佳性能。

1、MySQL存储引擎的分类 

分类如下图

MySQL-入门(三)终-LMLPHP

常用的存储引擎

  • MyISAM:节省数据库空间,当数据读远大于修改时,可以使用该存储引擎
  • InnoDB:支持事务,如果数据修改较多时,可以使用该存储引擎
  • MEMORY:存储在内存中,速度快,如果存储非永久性数据时,可以使用该存储引擎

存储引擎常用指令:

(1)查看MySQL的存储引擎:show engines;

(2)在创建表的时候,可以使用engine指定存储引擎:如果没有指定存储引擎,则使用当前默认的存储引擎。

       CREATE TABLE table_name( NO INT )ENGINE = MyISAM;

(3)可以修改表的存储引擎,使用如下命令修改:ALTER TABLE 表名 ENGINE = 存储引擎名称;

(4)查看表使用的存储引擎:show create table emp;

二、MySQL的事务transaction

1、概念:事务可以保证多个操作原子性,对于数据库来说,事务可以保证批量的DML要么全成功,要么全失败。通常一个事务对应一个完整的业务

2、事务的执行:

update t_bank set money=500 where account=1001;

update t_bank set money=2500 where account=1002;

  • 如果上面的sql语句第一条执行成功了,但是由于某些原因第二条sql语句执行失败了,此时账户1001上的金额变成了500,而账户1002上的金额是2000,这样就不正确了。
  • 为了能够正常的执行业务,上面两条sql语句要么全部执行成功,要么全部执行失败,因为他们是最小的业务单元,不能再进行拆分了。
  • 当第一条sql语句执行结束后,并不会立即修改数据库表中的数据,而是在内存中记录一下,第二条sql语句执行成功后,才会修改数据库表中的数据,如果第二条sql语句执行失败了,则将清空内存中的记录,此时并不会修改数据库表中的数据,要实现这样的功能,就必须使用事务来完成。

3、事务具有四个特征ACID

  • 原子性(Atomicity),事务是最小单元,不可再分;
  • 一致性(Consistency),事务要求所有的DML语句操作的时候,必须保证同时成功或同时失败;
  • 隔离性(Isolation),一个事务不会影响其他事务的执行;
  • 持久性(Durability),在事务完成之后,该事务对数据库所作的更改将持久地保存在数据库中,并不会被回滚;

4、MySQL事务的提交和回滚

  • MySQL中默认情况下,事务是自动提交的,当执行一条DML(增删改数据库表数据)语句时,就开启并且自动提交了事务。可以通过下面的语句查看事务是否是自动提交的:show variables like '%commit%';
  • 自动提交事务代表该事务已经对数据库进行对应操作
  • 手动提交后的事务提交和回滚
    • 如果想要关闭MySQL事务的自动提交,可以使用下面语句手动开启事务:start transaction;关闭自动提交后,进行的DML语句都不会对数据库进行操作,先在内存中进行操作。
    • 所以关闭自动提交后可以使用rollback;  语句进行事务回滚,清空该事务在内存的记录,数据回滚上一个状态值。回滚只能回滚在内存的操作,无法回滚在数据库的操作
    • 手动开启事务只有当使用commit;语句提交事务后,事务提交到了数据库进行操作,才会改变数据库的值,此时无法进行回滚,rollback失效,因为事务已经对数据库操作了,无法回滚。

5、事务的隔离级别,查看当前会话的隔离级别命令:select @@tx_isolation;

  • read uncommitted 读未提交
    • 事务A和事务B,事务A未提交的数据,事务B可以读取,这里读取到的数据叫做“脏数据”,该级别最低,一般只是理论上存在,数据库的默认隔离级别都高于该级别。
  • read committed 读已提交
    • 事务A和事务B,事务A提交的数据,事务B才可读取到,换句话说:对方事务提交之后的数据,当前事务才可读取到,可以避免读取“脏数据”,但是改级别会有“不可重复读”的问题,事务B读取一条数据,当事务A修改这条数据并提交后,事务B再读取这条数据时,数据发生了变化,即事务B每次读取的数据有可能不一致,这种情况叫做“不可重复读”。
  • repeatable read 重复读
    • MySQL默认的隔离级别是重复读,该级别可以达到“重复读”的效果,但是会有“幻读”的问题,即事务A读取数据,此时事务B修改了这条数据,但是事务A读取的还是之前的旧数据的内容,这样就出现了幻读。
  • serializable 串行化
    • 事务A和事务B,事务A在操作数据库表中数据的时候,事务B只能排队等待,这样保证了同一个时间点上只有一个事务操作数据库,该级别可以解决“幻读”的问题。但是这种级别一般很少使用,因为吞吐量太低,用户体验不好。

      MySQL-入门(三)终-LMLPHP

6、脏读、不可重复读和幻读的区别

  • 脏读:脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。
  • 不可重复读:同时操作,事务一分别读取事务二操作时和提交后的数据,读取的记录内容不一致。不可重复读是指在同一个事务内不同时间的两次查询,两个相同的查询返回了不同的结果。
  • 幻读:和不可重复读类似,但是事务二的数据操作仅仅是插入和删除,不是修改数据,读取的记录数量前后不一致,导致出现幻觉的现象。
  • 不可重复读和幻读的区别是前者由于事务对数据进行update导致查询出不同数据不一致;后者由于事务对数据进行insert或者delect,导致原来查询存在的数据像幻觉一样变多或者变少了。

三、mysql索引

1、索引的作用

  • 索引相当于一本字典目录,能够提高数据库的查询效率,表中每一个字段都可添加索引。主键会自动添加索引,在查询时,如果能通过主键查询的尽量使用主键查询,效率高。

2、MySQL数据库表中的检索方式有两种:

  • 全表扫描(效率低)
    • 例如:select * from emp where ename = ‘KING';如果ename字段没有添加索引的话,就会发生全表扫描。
  • 通过索引检索

3、添加索引的情况:

  • 该字段数据量庞大;
  • 该字段很少的DML操作(由于索引也需要维护,DML操作多的话,也影响检索效率);
  • 该字段经常出现在where条件中;
  • 注意:实际开发中会根据项目需求等综合因素来做调整,添加索引并不能保证一定能够提升检索效率,索引添加不当也有可能会导致效率降低。

4、使用索引

  • 创建索引
    • 语法:create index 索引名 on 表名(列名);
    • create index dept_dname_index on dept(dname);
  • 查看索引
    • 语法:show index from 表名;
    • show index from dept;
  • 删除索引
    • 语法:drop index 索引名 on 表名;
    • drop index dept_dname_index on dept;

四、mysql视图

 1、视图其实就是一个查询结果,视图的作用可以隐藏表的实现细节。

2、使用视图

  • 创建视图
    • 语法:create view 视图名称 as 查询语句;
    • 示例,将emp表中的empno、ename、sal作为视图展示:
    • create view e_infoas select empno,ename,sal from emp;
  • 修改视图
    • 语法:alter view 视图名称 as 查询语句
    • 示例:alter view e_info as select ename,job from emp;
  • 删除视图
    • 语法:drop view if exists 视图名称;
    • 示例:drop view if exists e_info;

3、数据库的导出和导入

  • 导出命令,在命令提示符下:monkey1024是要导出的数据库的名称。> d:/init.sql是数据库sql脚本的地址
    • mysqldump -u root -p monkey1024 > d:/init.sql
  • 导入sql脚本,在命令提示符(管理员权限)下登录成功后,输入下面内容:
    • source d:/init.sql
    • 即source后写上sql文件的目录地址。
07-17 23:30