MySQL数据库索引

索引的概念

索引是一个特殊的文件,包含着对数据表中所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。例如需要遍历 200 条数据,在没有索引的情况下,数据库会遍历全部 200 条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录。

是一个排序的列表,存储着索引值和这个值所对应的物理地址
无须对整个表进行扫描,通过物理地址就可以找到所需数据
是表中—列或者若干列值排序的方法

需要额外的磁盘空间

索引的作用

建立索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。但是相比付出的代价,索引的作用显得更为重要:

数据库利用各种快速定位技术,能够大大加快查询速率
当表很大或查询涉及到多个表时,可以成干上万倍地提高查询速度
可以降低数据库的IO成本,并且还可以降低数据库的排序成本
通过创建唯─性索引保证数据表数据的唯─性
可以加快表与表之间的连接
在使用分组和排序时,可大大减少分组和排序时间

索引的分类

MySQL 的索引分为以下几类:

普通索引: 这是最基本的索引类型,而且它没有唯一性之类的限制
唯一性索引:这种索引和前面的 “普通索引” 基本相同,但有一个区别:索引列的所有值只能出现一次,即必须唯一。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。
主键索引:主键是一种唯一性索引,但它必须指定为 “PRIMARY KEY” 。在数据库中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。
全文索引:索引类型为 FULLTEXT ,全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。
单列索引与多列索引:索引可以是单列上创建的索引,也可以是在多列上创建的索引。多列索引可以区分其中一列可能有相同值的行。如果经常同时搜索两列或多列或两列或多列排序时,索引也很有帮助。

创建索引的原则依据

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

表的主键、外键必须有索引。主键具有唯一性,索引值也是唯一的,查询时可以快速定位到数据行。外键一般关联的是另一个表的主键,所以在多表查询时也可以快速定位。
数据量超过 300 行的表应该有索引。数据量较大时,如果没有索引,需要把表遍历一遍,严重影响数据库的性能。
经常与其他表进行表连接的表,在连接字段上应该建立索引。
唯一性太差的字段不适合建立索引。如果索引字段的数据唯一性太差,是不适合创建的。
更新太频繁的字段不适合创建索引。在表中进行增加、删除、修改操作时,索引也有相应操作产生。字段更新过于频繁,对于系统资源占用也会更多。
经常出现在 Where 子句中的字段,特别是大表的字段,应该建立索引。
索引应该建在选择性高的字段上。如果很少的字段拥有相同值,即有很多独特值,则选择性很高。
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建立索引。

索引的实操

普通索引

命令格式:CREATE INDEX <索引的名字> ON tablename (列的列表)

创建索引
以这表为例,选取某一项创建索引

desc aaa;

以名字和年龄这两项创建索引
create index putong on bbb(name);
create index putong1 on bbb(age);

查看索引
show index from bbb\G;

在这里插入图片描述
删除索引再查看

drop index putong1 on bbb;

在这里插入图片描述
修改表时添加索引再查看

alter table bbb add index putong3(height);
在这里插入图片描述
创建表时添加索引再查看

create table ccc(num int(6) not null primary key, name varchar(64) not null, age int(3) not null, index putong5(name));
show index from ccc\G;

在这里插入图片描述

唯一性索引

与“普通索引”基本相同
与普通索引的区别是索引列的所有值只能出现一次,即必须唯一

创建表

insert into ddd values(001,'zhangsan',16),(002,'lisi',17),(003,'lisi',18),(004,'wangwu',18);

在这里插入图片描述

创建唯一索引
由于名字和年龄都有重复的数据,所以无法创建唯一索引
id中没有重复的数据,所以可以创建唯一索引
在这里插入图片描述
第二种创建方式
先删除之前创建的唯一索引
在这里插入图片描述
修改时创建唯一索引
在这里插入图片描述
创建表时添加唯一索引

 create table xxx(id int(10), name varchar(128), numder int(10), unique three(id));

在这里插入图片描述
查看索引

show index from xxx;

在这里插入图片描述
主键索引
是一种特殊的唯一索引,指定为“primary key”
一个表只能有一个主键,不允许有空值(非空且唯一)

创建表时创建

create table sss(id int(3) not null primary key, name varchar(64), age int(3) not null);

在这里插入图片描述
修改表结构方式创建

create table qqq(id int(3) not null , name varchar(64), score int(3));
alter table qqq add primary key(id);

在这里插入图片描述
组合索引

可以是单列上创建的索引,也可以是在多列上创建的索引
最左原则,从左往右依次执行

create table eee(id int(3) not null , name varchar(64), score int(3), index eee(id, name, score));

在这里插入图片描述

全文索引

创建表时创建

create table www(id int(3) not null , name varchar(64), score int(3), fulltext (name));
在这里插入图片描述
在已存在的表上创建全文索引

mysql> create fulltext index quanwen on aa(name);

在这里插入图片描述
修改表结构方式创建

alter table aa add fulltext index quanwen2(name);

在这里插入图片描述

事务的概念及特点

事务的概念

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

事务的ACID特点

事务具体由四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(lsolation)、持久性(Durability)
原子性(Atomicity)

事务是一个完整的操作,事务的各元素是不可分的
事务中的所有元素必须作为一个整体提交或回滚
如果事务中的任何元素失败,则整个事务将失败

一致性(Consistency)

当事务完成时,数据必须处于一致状态
在事务开始前,数据库中存储的数据处于一致状态
在正在进行的事务中,数据可能处于不一致的状态
当事务成功完成时,数据必须再次回到已知的一致状态

隔离性(lsolation)

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据

持久性(Durability)

指不管系统是否发生故障,事务处理的结果都是永久的
一旦事务被提交,事务的效果会被永久地保留在数据库中

事务控制语句

MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交
事务控制语句

BEGIN或START TRANSACTION > 开始一个事务
COMMIT > 提交
ROLLBACK > 回滚
SAVEPOINT identifier > 创建保存点
RELEASE SAVEPOINT identifier > 删除保存点
ROLLBACK TO identifier> 回滚到指定保存点
SET TRANSACTION> 设置事务的隔离级别

事务的控制方法

手动对事务进行控制的方法
事务处理命令控制事务

bebin:开始一个事务,后面会有多条数据库操作语句执行
commit:提交一个事务,对应前面的 begin 操作,他们之间的数据库操作语句一起完成
rollback:回滚一个事务使用,在 begin 和 commit 之间,如果某一个数据库操作语句出现错误,执行 rollback 回滚,数据库回到 begin 之前的状态,也就是操作语句都没执行

使用set命令进行控制

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

自动提交默认为开启状态在这里插入图片描述
关闭自动默认提交
在这里插入图片描述

每次重新连接数据库的时候,自动默认提交都处于开启状态

事务控制语句

MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交
事务控制语句

BEGIN或START TRANSACTION  开始一个事务
COMMIT     提交
ROLLBACK   回滚
SAVEPOINT identifier         创建保存点
RELEASE SAVEPOINT identifier 删除保存点
ROLLBACK TO identifier  回滚到指定保存点
SETTRANSACTION          设置事务的隔离级别

事务的控制方法

手动对事务进行控制的方法
事务处理命令控制事务
begin:开始一个事务
commit:提交一个事务
rollback:回滚一个事务
使用set命令进行控制
set autocommit=0:禁止自动提交(可指定多条语句是一个事务,不自动提交,需要自己打commit提交)
set autocommit=1:开启自动提交(每一条语句都是一个事务,且自动提交)

事务的操作

创建的数据表存储引擎必须是innodb,才支持事务(5.7版本默认就是innodb)

在这里插入图片描述

在这里插入图片描述
三种情况事务开始:

begin;
set autocommit=0;
start transaction

三种情况结束事务:

commit;
set autocommit=1;
rollback

存储引擎概

存储引擎概念介绍

MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
MySQL常用的存储引擎

MyISAM
lnnoDB

MySQL数据库中的组件,负责执行实际的数据I/O操作
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

MyISAM的介绍及特点

MyISAM不支持事务,也不支持外键
访问速度快
对事务完整性没有要求
MyISAM在磁盘上存储成三个文件

.frm文件存储表定义数
据文件的扩展名为.MYD (MYData)
索引文件的扩展名是.MYI (MYIndex)

表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞

会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入

数据单独写入或读取,速度过程较快且占用资源相对少
MyIAM支持的存储格式

静态表
动态表
压缩表

存储格式解释

静态表:静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面的空格会被自动处理掉。
动态表:动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE
TABLE 语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。
压缩表:压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

MyISAM适用的生产场景

公司业务不需要事务的支持
单方面读取或写入数据比较多的业务
MylSAM存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差

lnnoDB特点介绍

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

部分注释

分区:就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
分表:就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它
分库:一旦分表,一个库中的表会越来越多
表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表,所以称作表空间

一个数据库可以包含多个表空间,一个表空间只能属于一个数据库
一个表空间包含多个数据文件,一个数据文件只能属于一个表空间

lnnoDB适用生产场景

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

企业选择存储引擎依据

需要考虑每个存储引擎提供的核心功能及应用场景
支持的字段和数据类型

所有引擎都支持通用的数据类型
但不是所有的引警都支持其它的字段类型,如二进制对象

锁定类型:不同的存储引擎支持不同级别的锁定

表锁定
行锁定

索引的支持

建立索引在搜索和恢复数据库中的数据时能显著提高性能
不同的存储引擎提供不同的制作索引的技术
有些存储引擎根本不支持索引

事务处理的支持

提高在向表中更新和插入信息期间的可靠性
可根据企业业务是否要支持事务选择存储引擎

修改存储引擎

查看aaa表的引擎

在这里插入图片描述
方法一:

alter table 修改

在这里插入图片描述

方法二:

修改my.cnf
vi /etc/my.cnf
default-storage-engine=MyISAM

在这里插入图片描述
重启数据库
在这里插入图片描述

在这里插入图片描述
方法三:

create table创建表时指定存储引擎
create table asd(id int(8)) engine=InnoDB;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值