加入收藏 | 设为首页 | 会员中心 | 我要投稿 徐州站长网 (https://www.0516zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL索引、事务与存储引擎

发布时间:2022-11-02 15:01:52 所属栏目:MySql教程 来源:转载
导读: 目录
一、MySQL索引 1.1索引的概念 1.2索引的作用及优缺点 1.2.1优点
设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要原因。
1.2.2缺点

目录

一、MySQL索引 1.1索引的概念 1.2索引的作用及优缺点 1.2.1优点

设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要原因。

1.2.2缺点 1.3创建索引的原则依据

索引可以提升数据库查询的速度,但不是任何情况下都是和创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。

1.4索引的分类和创建 1.4.1普通索引

最基本的索引类型,没有唯一性之类的限制

直接创建索引

CREATE INDEX 索引名 ON 表名 (列名[(length)]);

mysql创建表时普通索引_查阅mysql哪些表有索引_mysql索引表

修改表方式创建

ALTER TABLE 表名 ADD INDEX 索引名 (列名);

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

创建表的时候指定索引

CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

mysql创建表时普通索引_查阅mysql哪些表有索引_mysql索引表

1.4.2唯一索引

与普通索引类似,但区别是唯一索引列的每个值都唯一。唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。

直接创建唯一索引

CREATE UNIQUE INDEX 索引名 ON 表名(列名);

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

修改表方式创建唯一索引

ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

创建表的时候指定唯一索引

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

1.4.3 主键索引

是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

创建表的时候指定主键索引

修改表方式创建主键索引

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

1.4.4 组合索引(单列索引与多列索引)

可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为 select 语句的 where 条件是依次从左往右执行的,所以在使用 select 语句查询时 where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

1.4.5 全文索引(FULLTEXT)

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在 MySQL5.6 版本以前。

直接创建全文索引

CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

修改表方式创建全文索引

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

创建表的时候指定全文索引

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

数据类型可以为 CHAR、VARCHAR 或者 TEXT

使用全文索引查询

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

1.5 查看索引

show index from 表名;
show keys from 表名;

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

1.6 删除索引

直接删除索引

DROP INDEX 索引名 ON 表名;

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

修改表方式删除索引

ALTER TABLE 表名 DROP INDEX 索引名;

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY;

mysql索引表_查阅mysql哪些表有索引_mysql创建表时普通索引

二、MySQL事务 2.1 事务的概念

总的来说,事务就是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位。

2.2 事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。

2.2.1 原子性

指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

2.2.2 一致性

指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏

2.2.3 隔离性

指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

事务之间的相互影响分为几种,分别为

(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 。

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

查询全局事务隔离级别

show global variables like '%isolation%';
SELECT @@global.tx_isolation;

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

查询会话事务隔离级别

show session variables like '%isolation%';
SELECT @@session.tx_isolation; 
SELECT @@tx_isolation;

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

设置全局事务隔离级别

set global transaction isolation level serializable;

mysql创建表时普通索引_查阅mysql哪些表有索引_mysql索引表

设置会话事务隔离级别

set session transaction isolation level read committed;

mysql创建表时普通索引_查阅mysql哪些表有索引_mysql索引表

2.2.4 持久性

在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

小结

在事务管理中,原子性是基础,隔离性是手段,一致性是目的,持久性是结果。

2.3 事务控制语句

BEGIN 或 START TRANSACTION:显式地开启一个事务。

COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。

ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。

ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

2.3.1 测试begin和commit(开始事务和提交事务)

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

2.3.2 测试事务未提交的回滚

mysql索引表_查阅mysql哪些表有索引_mysql创建表时普通索引

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

2.3.3 测试创建回滚点并进行回滚

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

mysql创建表时普通索引_查阅mysql哪些表有索引_mysql索引表

2.4 使用 set 设置控制事务

#禁止自动提交(状态为OFF)

SET AUTOCOMMIT=0;

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

#开启自动提交mysql索引表,Mysql默认为1(状态为ON)

SET AUTOCOMMIT=1;

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

#查看Mysql中的AUTOCOMMIT值

show variables like 'autocommit';

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

注意:

三、MySQL存储引擎 3.1 MyISAM 表支持的3 种不同的存储格式 3.1.1 静态(固定长度)表

静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。

3.1.2 动态表

动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。

3.1.3 压缩表

压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

3.2 控制语句

1)查看系统支持的存储引擎

show engines;

查阅mysql哪些表有索引_mysql创建表时普通索引_mysql索引表

2)查看表使用的存储引擎

法一:

show table status from 库名 where name='表名'\G;

查阅mysql哪些表有索引_mysql索引表_mysql创建表时普通索引

法二:

use 库名;
show create table 表名;

mysql索引表_mysql创建表时普通索引_查阅mysql哪些表有索引

3)修改存储引擎

通过 alter table 修改

use 库名;
alter table 表名 engine=MyISAM;

mysql索引表_查阅mysql哪些表有索引_mysql创建表时普通索引

通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务

vim /etc/my.cnf
......
[mysqld]
......
default-storage-engine=INNODB
 
systemctl restart mysqld

mysql索引表_查阅mysql哪些表有索引_mysql创建表时普通索引

注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。

通过 create table 创建表时指定存储引擎

use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;

mysql创建表时普通索引_mysql索引表_查阅mysql哪些表有索引

查阅mysql哪些表有索引_mysql索引表_mysql创建表时普通索引

(编辑:徐州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!