【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:事务彻底串行执行.


结束!

相关推荐
superman超哥18 分钟前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
engchina1 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
engchina1 小时前
使用 Cypher 查询语言在 Neo4j 中查找最短路径
数据库·neo4j
尘浮生1 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
威哥爱编程1 小时前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
小华同学ai1 小时前
AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
数据库·信息可视化·开源
Acrelhuang2 小时前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
十叶知秋2 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
瓜牛_gn4 小时前
mysql特性
数据库·mysql
奶糖趣多多5 小时前
Redis知识点
数据库·redis·缓存