mysql的事务和索引

隔离级别

事务的四大特性分别是:原子性、一致性、隔离性、持久性

第一种隔离级别:Read uncommitted(读未提交)

如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据

解决了更新丢失,但还是可能会出现脏读

第二种隔离级别:Read committed(读提交)

如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

解决了更新丢失和脏读问题,不可重复读

第三种隔离级别:Repeatable read(可重复读取)

可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。

解决了更新丢失、脏读、不可重复读、但是还会出现幻读

第四种隔离级别:Serializable(可序化)

提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读

解决了更新丢失、脏读、不可重复读、幻读(虚读)

查看当前隔离级别

一般默认是可重复读
SELECT @@tx_isolation;

查看事务是否自动提交

MySQL 默认开启事务自动提交模式,即除非显式的开启事务(BEGIN 或 START TRANSACTION),否则每条 SOL 语句都会被当做一个单独的事务自动执行

一般默认是自动提交
SHOW VARIABLES LIKE 'autocommit';

修改自动提交
SET autocommit = 0|1|ON|OFF;

mysql索引类型

普通索引

特性:普通索引允许在定义索引的列中插入重复值和空值
s

目的:加快系统对数据的访问速度

CREATE INDEX index_id ON tb_student(id);

唯一索引

特性:索引列的值必须唯一,允许有空值

目的:目的不是为了提高访问速度,而是为了避免数据出现重复

CREATE UNIQUE INDEX index_id ON tb_student(id);

主键索引

特性不允许值重复或者值为空

目的:专门为主键字段创建的索引

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );

组合索引

特性:可以加多个字段

目的:为表索引添加多个字段

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);

全文索引

特性:只有 MyISAM 存储引擎支持全文索引

目的:用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建

CREATE FULLTEXT INDEX index_info ON tb_student(info);

索引失效的情况

1.使用or操作符

:如果or的两边都是同类型的索引,那么索引还是会使用到,eg:

# id是主键,这样就会用到主键索引
EXPLAIN SELECT * FROM test WHERE id > 3 OR id < 1;

2.未从组合索引的第一列开始使用

(t1,t2,t3)建立了复合索引,如果我们的查询条件中没有使用到第一列,那么该索引也就没有办法使用,eg:

-- 未使用索引的第一列t1
EXPLAIN SELECT * FROM test WHERE t2 = '1';

3.使用%在前面的like查询

-- 未使用索引
EXPLAIN SELECT * FROM test WHERE t1 LIKE '%1';

4.索引列上使用函数

因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,自然就没办法走索引了

-- 未使用索引
explain select * from test where length(t1) = 2;

5.索引进行表达式计算

因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,自然就没办法走索引了

--num字段有二级索引,使用了索引
EXPLAIN SELECT * FROM test WHERE num = 1 + 10;

--没有使用了索引
EXPLAIN SELECT * FROM test WHERE num + 1 = 10;

6.隐式类型转换

当字段类型为字符串且建有索引,而查询条件类型为数值时,会将字符串类型隐式转换为浮点型,此时索引会失效。

-- t1是字符串,索引失效
EXPLAIN SELECT * FROM test WHERE t1 = 1.1;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值