【MySQL】索引

目录

1.索引

1.1查看索引

1.2创建索引

1.3删除索引

1.4索引底层的数据结构

2.事务

2.1使用事务

2.2事务的特性

[// 隔离性](#// 隔离性)


前情提要:一张表里有很多数据,基本查找就是遍历表,一条一条筛选,效率十分低下,因此可以给这个表建立一个索引,提高查找的速度。

1.索引

优点:提高查找的速度.

缺点:1> 消耗额外的空间(索引数据存储在硬盘上);

2> 可能拖慢增删改的速度(增删改后需要修改索引)

1.1查看索引

格式:show index from 表名;

注意:当表中存在主键primary key或unique约束或外键约束时,内部会自动给表创建索引。

sql 复制代码
mysql> create table student(id int primary key, name varchar(20));
Query OK, 0 rows affected (0.03 sec)

mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

mysql> create table student1(id int unique, name varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> show index from student1;
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student1 |          0 | id       |            1 | id          | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

1.2创建索引

格式:create index 索引名 on 表名(列名);

注意:此操作可能会 非常危险!!若表非空且包含巨量数据,创建索引会引起非常大规模的硬盘IO操作。所以在设计表的时候就要考虑哪些列需要索引。

sql 复制代码
mysql> create index idx_student_name on student(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from student;
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name         | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY          |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| student |          1 | idx_student_name |            1 | name        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

1.3删除索引

格式:drop index 索引名 on 表名;

注意:无法删除建表时系统自动生成的索引,只能删除自己手动创建的索引。

删除索引这个操作也可能 非常危险!!原因同创建索引。

sql 复制代码
mysql> drop index idx_student_name on student;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.01 sec)

1.4索引底层的数据结构

MySQL索引的数据结构取决于MySQL使用哪个存储引擎。数据库这块组织数据使用的数据结构是在硬盘上的。读写一次硬盘,开销远远大于内存的。读写一次硬盘大约相当于读写1w次内存。

2.事务

概念:逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部执行失败。

在不同的环境中都可以有事务,对应在数据库中就是数据库事务。

2.1使用事务

步骤:

1> 开启事务:start transaction;

2> 执行多条SQL语句;

3> 回滚或提交:rollback / commit;

说明:rollback是全部失败,commit是全部成功。

sql 复制代码
mysql> start transaction;
-- 阿里巴巴账户减少2000
mysql> update accout set money=money-2000 where name = '张三';
-- 四十大盗账户增加2000
mysql> update accout set money=money+2000 where name = '李四';

commit;

2.2事务的特性

* 原子性:保证多个操作被打包成一个整体,要么能够全部执行正确,要么一个都不执行;

* 一致性:事务执行之前,和事务执行之后,数据能够对得上;

* 持久性:事务中的各种操作都是持久生效的,一旦执行成功,产生的修改都会写到硬盘中;

* 隔离性:并发执行事务的时候,隔离性会在执行效率和数据可靠之间做出权衡,隔离性越高,并发性越低,数据越可靠,性能就越低。

// 隔离性

1)脏读:A在写事务,同时B在读事务,B在多次读的过程中可能会读到不同的值.

解决方法:给写操作加锁,直到A写完并提交事务后,B才可以查看该事务.

2)不可重复读:A在读事务,同时B在写事务,B在多次读的过程中可能会读到不同的值.

解决方法:给读操作也加锁,A在读事务的时候,B不能写.

3)幻读:一次事务在多次读的时候,虽然读到的数据的值是一样的,但是结果集不同.

解决方法:串行化,彻底放弃并发执行事务,所有的事务都是一个一个串行执行.

此时并发性最低,隔离性最高,效率最低,数据最可靠.

MySQL提供了四种事务的隔离级别,可以自己配置隔离级别:

read uncommitted (RU):允许读未提交的数据.

read committed (RC):允许读已经提交的数据.(给写操作加锁了)

repeatable read (RR):可以重复读取数据.(给写操作和读操作加锁了),这是默认隔离级别.

serializable:事务彻底串行执行.


结束!

相关推荐
阳冬园12 分钟前
mysql数据库 主从同步
数据库·主从同步
XiaoH23323 分钟前
培训机构Day15
sql·mysql
ThisIsClark44 分钟前
【后端面试总结】MySQL主从复制逻辑的技术介绍
mysql·面试·职场和发展
Mr.131 小时前
数据库的三范式是什么?
数据库
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Python之栈2 小时前
【无标题】
数据库·python·mysql
风_流沙2 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
亽仒凣凣2 小时前
Windows安装Redis图文教程
数据库·windows·redis
亦世凡华、2 小时前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
YashanDB2 小时前
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
数据库·yashandb·崖山数据库