Mysql的索引

Mysql的索引、事务和存储引擎

一、索引

1、概念

索引是一个排序的列表,在列表当中存储索引的值以及索引对应数据所在的物理行

索引值和数据是一个映射关系

2、作用

使用索引之后,就不需要扫描全表来定位某行的数据

加快数据库的查询速度

索引可以是表中的一列,也可以是多个列

3、优点

3.1 设置了索引之后,数据库可以利用索引快速定位,大大提高查询速度,这也是创建索引的主要原因

3.2 尤其是在表的数据很大,以及涉及多个表查询时,索引可以大大的提高查询速度

3.3 建立索引不仅能够提高查询速度,在恢复数据库的数据时,也能提高性能

3.4 可以加快表与表之间连接查询速度

4、缺点

4.1 创建的索引也需要占用额外的磁盘空间 INNODB存储引擎表数据和索引文件在一块,相对来说占的空间小一点

4.2 更新一个包含索引的表比没有索引的表需要花费更多的时间(表需要更新、索引需要更新,所以速度要慢很多)

理想的做法:经常被作为搜索条件的列上面创建索引

5、创建索引的原则和依据

5.1 表的主键和外键必须有索引,主键是唯一的,外键是关联主表的,查询时可以快速定位

5.2 一张表有超过300行的数据,应该要创建索引

5.3 经常与其他表进行连接的表,在连接字段上应该创建索引

5.4 更新太频繁到字段不适合创建索引

5.5 经常作为where语句的条件列,应该创建索引

5.6 经常使用group by和other by的字段上要建立索引

5.7 选择一个性能高的字段作为索引,字段的值不同的越多越好

5.8 索引要建立在小字段上,字符串的长度比较小的字段,对于长文本字段,超长字段不适合建立索引

6、索引的类型

b-tree索引:b-树索引

绝大部分的数据都是使用b-树索引

特点:从索引的左边的列开始,从左到右按顺序进行排列

哈希索引

根据索引对应的哈希值的方法获取表的记录行,速度较慢,用的比较少

二、创建索引

1、创建索引

bash 复制代码
create table member (
id int(10),
name varchar(10),
cardid int(18),
phone int(11),
address varchar(50),
remark text,
# text也是数据类型的一种,和char、varchar性质相同,都是字符串,不需要长度的参数,可以作为答问比的列,可以存储65335个字符
index name_index (name)
);

select * from member;
show index from member;

# 创建索引
alter table member add index id_index(id);
# 发现表中少了索引数据,在外面插入索引

insert into member values(1,'小赵','320103','137878787','北京','vip');

insert into member values(2,'小钱','320104','137888888','上海','vip2'),(3,'小孙','320105','138989898','广州','vip3');
# 一次性插入多个数据

explain select * from member where id = 1;
# 前面加explain,表示查询当前语句使用索引的情况

# 唯一索引
# 可以用key的方式创建,也可以用index的方式创建
create unique index cardid_index on member(cardid);

# phone这一列,用alter的方式创建一个唯一索引
alter table member add unique index phone_index(phone);

# 主键索引是一种特殊的唯一索引

# 删除索引:drop和alter
drop index 索引名 on 表名;
drop index phone_name on member;

alter table 表名 drop index 索引名;
alter table member drop index id_index;

show index from member;

# 组合索引
# 一次性给多个列创建索引,形成一个组合
alter table member add constraint uc_name_cardid_phone unique (name,cardid,phone);

select * from member where name =一个值 and cardid =一个值 and phone =一个值;

# 适用于模糊查询,检索大文本使用
show index from member;
create fulltext index 索引名 on 表名 (列名);
create fulltext index remark_index on member (remark);

explain select * from member where match(remark) against('vip');

2、五种索引

普通索引:alter和create

主键索引:是一种特殊的唯一索引

唯一索引:alter和create后面加unique

组合索引:一次性给多个列创建索引,形成一个组合

全文索引:适用于模糊查询,检索大文本使用

3、索引练习

bash 复制代码
商场做一个会员卡系统,包含以下字段
会员编号 int 5
会员姓名 varchar 10
会员身份证号 int 11
会员的地址 varchar 50
会员的入会时间 timestamp 当前时间
会员的备注信息 text

创建时设计好该表的索引:
主键 id
姓名创建 普通索引
身份证 唯一索引
会员信息 模糊查询 全文索引

create table member (
id int(5) primary key,
name varchar(10),
cardid int(11),
address varchar(50),
date_times timestamp,
remark text,
unique index cardid_index (cardid),
fulltext index remark_index (remark),
index name_index (name)
);

show index from member;

三、Mysql的事务

1、概念

事务是一种机制,一个操作序列,一组或者是一条数据库的操作命令,把所有的命令作为一个整体向系统提交或者撤销的操作

特点:要么都成功,要么都失败

数据的一致性,数据的一致性非常重要

事务是一个不可分割的工作逻辑单元,在数据库上执行并发操作时,事务是一个最小的控制单元

数据库通过事务的控制和事务的整体性保证数据的一致性

事务的特点:ACID 在数据库的管理系统中,事务的特性有ACID这四种

A:ATOMICITY 原子性

C:consistency 一致性

I:isolation 隔离性

D:Durability 持久性

原子性:事务的最小控制单位,不可分割,要么都成功,要么都失败

一致性:事务开始之前和事务结束之后,数据库的完整性没有被破坏

开始的时候数据是一致的,结束的时候数据也是一致的

在事务进行的时候,数据可以处于不一致的状态,但是一旦结束,数据必须回到一致

create table cost (
id int(10),
name char(10),
money int(20)
);

隔离性:在并发环境中,不同的事务同时操作相同的数据时,每个事务都有自己完整的数据空间,对数据修改所发生的的并发事务是隔离的,每个事务之间都是独立的,一个用户的事务不被其他事务所干扰,

数据库的隔离性:

1、未提交读,read uncommitted RU

允许脏读,一个事务可以看到其他事务未提交的修改

bash 复制代码
# 脏读
create table cost (
id int(10),
name char(10),
money int(20)
);

select * from cost;
show global variables like '%isolation%';
# 查看全局会话的隔离级别

show session variables like '%isolation%';
# 查看当前会话的隔离级别

set global transaction isolation level Read Uncommitted;
# 把全局改成

set session transaction isolation level Read Uncommitted;
# 脏读

命令行
mysql -u root -p
select * from cost;

2、提交读,read committed RC

一个事务只能看到其他事务已经提交的修改,未提交的修改不可见,防止脏读

oracle和sql sever

3、可重复读,repatable read RR

一个事务在执行中,执行两次相同的select语句,得到的结果都是相同的

mysql的默认隔离选项,防止脏读和不可重复读

4、串行读,相当于锁表,完全串行化的读,一个事务在使用,其他事务的读写都会阻塞

不可重复读:在一个事务内,多次读同一数据,一个事务没有结束,另外一个事务也访问该数据

其中一个事务连续两次查询发现结果不一致,另外一个事务在对这个数据进行修改,两次看到的数据不能一致

幻读:一个事务对一个表的数据进行修改,另一个表也修改了表中的数据,前一个事务会发现修改的结果不正确,类似于出现了幻觉

不可更新:两边同时对数据进行修改,但是一方先提交,一方后提交,后提交会覆盖先提交的

持久性:一旦写入数据库,数据不可更改

事务控制语句

bash 复制代码
begin;
# 表示开启一个事务,也可使用start transaction

commit;
# 提交事务

rollback
# 回滚

savepoint 名称
# 设置回滚点

rollback to savepoint 名称
# 回滚到指定的点

回滚点只能回滚一次
一旦提提交回滚点失效(持久性)
相关推荐
PyAIGCMaster1 分钟前
文本模式下成功。ubuntu P104成功。
服务器·数据库·ubuntu
drebander14 分钟前
MySQL 查询优化案例分享
数据库·mysql
初晴~30 分钟前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱5813635 分钟前
InnoDB 的页分裂和页合并
数据库·后端
YashanDB2 小时前
【YashanDB知识库】XMLAGG方法的兼容
数据库·yashandb·崖山数据库
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍11基于XML的SQL注入(XML-Based SQL Injection)
数据库·安全·web安全·漏洞挖掘·sql注入·hw·xml注入
小林coding3 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
风间琉璃""3 小时前
bugkctf 渗透测试1超详细版
数据库·web安全·网络安全·渗透测试·内网·安全工具
drebander3 小时前
SQL 实战-巧用 CASE WHEN 实现条件分组与统计
大数据·数据库·sql
IvorySQL3 小时前
IvorySQL 4.0 发布:全面支持 PostgreSQL 17
数据库·postgresql·开源数据库·国产数据库·ivorysql