一、MySQL 索引
1.1 索引的概念
1.2 索引的作用及缺点
1.2.1 优点
1.2.2 缺点
1.3 创建索引的原则依据
1.4 索引的分类和创建
1.4.1 普通索引
1.4.2 唯一索引
1.4.3 主键索引
1.4.4 组合索引(单列索引与多列索引)
1.4.5 全文索引(FULLTEXT)
1.5 查看索引
1.6 删除索引
二、MySQL事务
2.1 事务的概念
2.2 事务的ACID特点
2.2.1 原子性
2.2.2 一致性
2.2.3 隔离性
2.2.4 持久性
小结
2.3 事务控制语句
2.3.1 测试begin和commit(开始事务和提交事务)
2.3.2 测试事务未提交的回滚
2.3.3 测试创建回滚点并进行回滚
2.4 使用 set 设置控制事务
三、MySQL存储引擎
3.1 MyISAM 表支持的3 种不同的存储格式
3.1.1 静态(固定长度)表
3.1.2 动态表
3.1.3 压缩表
3.2 控制语句
1)查看系统支持的存储引擎
2)查看表使用的存储引擎
3)修改存储引擎
索引随可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。
最基本的索引类型,没有唯一性之类的限制。
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
ALTER TABLE 表名 ADD INDEX 索引名 (列名);
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
与普通索引类似,但区别是唯一索引列的每个值都唯一。唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));
是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));
可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为 select 语句的 where 条件是依次从左往右执行的,所以在使用 select 语句查询时 where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';
适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在 MySQL5.6 版本以前。
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
数据类型可以为 CHAR、VARCHAR 或者 TEXT
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');
show index from 表名;
show keys from 表名;
字段 | 含义 |
---|---|
Table | 表的名称 |
Non_unique | 如果索引不能包括重复词,则为0;如果可以,则为1 |
Key_name | 索引的名称 |
seq_in_index | 索引中的列序号,从1开始 |
column_name | 列名称 |
collation | 列以什么方式存储在索引中。在 MySQL中,有值'A(升序)或 NULL(无分类) |
Cardinality | 索引中唯一值数目的估计值 |
sub_part | 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL |
Packed | 指示关键字如何被压缩。如果没有被压缩,则为NULL |
Null | 如果列含有NULL,则含有YES。如果没有,则该列含有NO |
lndex_type | 用过的索引方法(BTREE,FULLTEXT,HASH,RTREE) |
comment | 备注 |
DROP INDEX 索引名 ON 表名;
ALTER TABLE 表名 DROP INDEX 索引名;
ALTER TABLE 表名 DROP PRIMARY KEY;
总的来说,事务就是是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。
指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
事务之间的相互影响分为几种,分别为
(1)脏读:一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的。
(2)不可重复读:一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
(3)幻读:一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。
(4)丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。
Mysql 及事物隔离级别
(1)read_uncommitted : 读取尚未提交的数据 :不解决脏读
(2)read_committed:读取已经提交的数据 :可以解决脏读
(3)repeatable_read:重读读取:可以解决脏读 和 不可重复读 —mysql默认的
(4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表
mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 | 第一类丢失更新 | 第二类丢失更新 |
---|---|---|---|---|---|
read uncommitted | 允许 | 允许 | 允许 | 禁止 | 允许 |
read committed | 禁止 | 允许 | 允许 | 禁止 | 允许 |
repeatable read | 禁止 | 禁止 | 允许 | 禁止 | 禁止 |
serializable | 禁止 | 禁止 | 禁止 | 禁止 | 禁止 |
show global variables like '%isolation%';
SELECT @@global.tx_isolation;
show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
set global transaction isolation level serializable;
set session transaction isolation level read committed;
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
在事务管理中,原子性是基础,隔离性是手段,一致性是目的,持久性是结果。
#禁止自动提交(状态为OFF)
SET AUTOCOMMIT=0;
#开启自动提交,Mysql默认为1(状态为ON)
SET AUTOCOMMIT=1;
#查看Mysql中的AUTOCOMMIT值
show variables like 'autocommit';
注意:
如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
当然无论开启与否,begin; commit|rollback; 都是独立的事务。
静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。
动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。
压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
show engines;
法一:
show table status from 库名 where name='表名'\G;
法二:
use 库名;
show create table 表名;
use 库名;
alter table 表名 engine=MyISAM;
vim /etc/my.cnf
......
[mysqld]
......
default-storage-engine=INNODB
systemctl restart mysqld
注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/m0_51160032/article/details/121599581
内容来源于网络,如有侵权,请联系作者删除!