本章目录
1. MySQL 索引
1.1 概念
1.2 作用
1.3 缺点
1.4 创建原则
2. 索引的分类和创建
2.1 普通索引
2.2 唯一索引
2.3 主键索引
2.4 组合索引
2.5 全文索引
3. 查看和删除索引
3.1 查看索引
3.2 删除索引
4. MySQL 事务
4.1 概念
4.2 ACID 特点
4.3 事务控制语句
4.4 使用 set 设置控制事务
5. MySQL 存储引擎
5.1 概念
5.2 MyISAM
5.3 InnoDB
5.4 企业选择存储引擎依据
5.5 MyISAM 表支持的 3 种不同的存储格式
6. 控制语句
1. MySQL 索引
1.1 概念
索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。
使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。
索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
索引是表中一列或者若干列值排序的方法。
建立索引的目的是加快对表中记录的查找或排序。
1.2 作用
设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。
当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
可以加快表与表之间的连接。
在使用分组和排序时,可大大减少分组和排序的时间。
1.3 缺点
索引需要占用额外的磁盘空间。
对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。
而 InnoDB 引擎的表数据文件本身就是索引文件。
在插入和修改数据时要花费更多的时间,因为索引也要随之变动。
1.4 创建原则
索引随可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
2. 索引的分类和创建
2.1 普通索引
最基本的索引类型,没有唯一性之类的限制。
(1)直接创建索引
MySQL表中key的含义:
(2)修改表方式创建索引
(3)创建表的时候指定索引
2.2 唯一索引
与普通索引类似,但区别是唯一索引列的每个值都唯一。
唯一索引允许有空值(注意和主键不同)。
如果是用组合索引创建,则列值的组合必须唯一。
添加唯一键将自动创建唯一索引。
(1)直接创建唯一索引
(2)修改表方式创建索引
(3)创建表的时候指定索引
2.3 主键索引
是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。
一个表只能有一个主键,不允许有空值。
添加主键将自动创建主键索引。
(1)创建表时指定
(2)修改表方式创建索引
2.4 组合索引
可以是单列上创建的索引,也可以是在多列上创建的索引。
需要满足最左原则,因为 select 语句的 where 条件是依次从左往右执行的,所以在使用 select 语句查询时 where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。
2.5 全文索引
适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。
在 MySQL5.6 版本以前,FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。
全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引。
(1)直接创建索引
(2)修改表方式创建索引
(3)创建表时指定索引
(4)使用全文索引查询
3. 查看和删除索引
3.1 查看索引
各字段的含义:
3.2 删除索引
(1)直接删除索引
(2)修改表方式删除索引
(3)删除主键索引
4. MySQL 事务
4.1 概念
事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。
事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。
事务通过事务的整体性以保证数据的一致性。
总的来说,事务就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
4.2 ACID 特点
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。
(1)原子性
(2)一致性
(3)隔离性
事务之间的相互影响分为几种,分别为:
Mysql 及事物隔离级别:
mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 | 第一类丢失更新 | 第二类丢失更新 |
read uncommitted | 允许 | 允许 | 允许 | 禁止 | 允许 |
read committed | 禁止 | 允许 | 允许 | 禁止 | 允许 |
repeatable read | 禁止 | 禁止 | 允许 | 禁止 | 禁止 |
serializable | 禁止 | 禁止 | 禁止 | 禁止 | 禁止 |
(4)持久性
在事务管理中,原子性是基础,隔离性是手段,一致性是目的,持久性是结果。
(1)查询全局事务隔离级别
(2)查询会话事务隔离级别
(3)设置全局事务隔离级别
(4)设置会话事务隔离级别
4.3 事务控制语句
4.4 使用 set 设置控制事务
1 SET AUTOCOMMIT=0; #禁止自动提交 2 SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1 3 SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值 4 5 如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。 6 如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。 7 当然无论开启与否,begin; commit|rollback; 都是独立的事务。 8 9 use bbc; 10 select * from test7; 11 SET AUTOCOMMIT=0; 12 update test7 set money= money + 100 where name='lucy'; 13 select * from test7; 14 quit 15 16 mysql -u root -p 17 use bbc; 18 select * from test7;
5. MySQL 存储引擎
5.1 概念
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。
MySQL常用的存储引擎:
MySQL数据库中的组件,负责执行实际的数据/O操作。
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。
5.2 MyISAM
(1)特点
.frm文件存储表结构的定义
数据文件的扩展名为.MYD (MYData)
索引文件的扩展名是.MYI (MYIndex)
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
静态表
动态表
压缩表
(2)MyISAM适用的生产场景举例
5.3 InnoDB
(1)特点
(2)InnoDB适用生产场景分析
5.4 企业选择存储引擎依据
需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景
支持的字段和数据类型:
锁定类型:不同的存储引擎支持不同级别的锁定
(1)索引的支持
(2)事务处理的支持
5.5 MyISAM 表支持的 3 种不同的存储格式
(1)静态(固定长度)表
静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。
(2)动态表
动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。
(3)压缩表
压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
6. 控制语句
(1)查看系统支持的存储引擎
(2)查看表使用的存储引擎
方法一:
方法二:
(3)修改存储引擎
1 vim /etc/my.cnf 2 ...... 3 [mysqld] 4 ...... 5 default-storage-engine=INNODB 6 7 systemctl restart mysql.service
-