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


结束!

相关推荐
Mr.kanglong2 小时前
【MySQL】初始MySQL、库与表的操作
数据库·mysql
GIS小小研究僧3 小时前
PostgreSQL 数据库备份与还原
数据库·postgresql·oracle·postgis
西木Qi3 小时前
数据库备份、主从、集群等配置
数据库
qw9493 小时前
MySQL(高级特性篇) 13 章——事务基础知识
数据库·mysql
MXsoft6183 小时前
基于监控易一体化运维软件的浪潮服务器监控指标详解
运维·数据库
码农幻想梦3 小时前
实验十 数据库完整性实验
数据库·sql·oracle
小安同学iter3 小时前
MySQL数据库(二)
数据库·sql·mysql·oracle
努力成为头发茂密的程序员4 小时前
(0基础版,无需输入代码爬取)新手小白初步学习八爪鱼采集器
数据库·学习·数据分析
martian6655 小时前
第22篇:Python开发进阶:详解使用SQLAlchemy进行ORM数据库编程技术
数据库·python·oracle
zm5 小时前
C基础寒假练习(4)
java·前端·数据库