08、索引

08、索引

1、什么是索引?

索引就相当于一本书的目录,通过目录可以快速找到对应的资源。

在数据库,查询一张表的时候有两种检索方式:

(1)全表扫描

(2)根据索引扫描(效率很高)

索引为什么可以提高检索效率呢?

​ 根本原理是缩小了扫描的范围。

注意:

  • 索引虽然可以提高检索效率,但是不能随便添加索引
  • 因为索引也是数据库当中的对象,也需要数据库不断的维护,是有维护成本的。
  • 如果表中数据经常被修改,就不适合使用索引,因为表中数据一旦修改,索引需要重新排序,进行维护

2、什么时候考虑给字段添加索引?

  • 数据量庞大(根据客户的需求,根据线上的环境)
  • 该字段的DML语句很少(因为字段进行修改操作,索引也需要维护)
  • 该字段经常出现在where子句中(经常根据那个字段查询)

3、注意

主键和具有unique约束的字段会自动添加索引

根据主键查询效率高,尽量使用主键查询

4、查看sql语句的执行情况

mysql> explain select ename ,sal from emp where sal = 5000;

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+

5、如何创建索引

语法:

创建索引:

create index 索引名称 on 表名(字段名);

删除索引:

drop index 索引名称 on 表名;

查看sql语句执行情况

mysql> create index emp_sal_index on emp(sal);
mysql> explain select ename ,sal from emp where sal = 5000;
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+

mysql> drop index emp_sal_index on emp;
mysql> explain select ename ,sal from emp where sal = 5000;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+

6、索引的底层结构

底层的数据结构:B+Tree

7、索引的原理

在这里插入图片描述
通过B Tree缩小扫描范围,底层索引进行了排序、分区,索引会携带数据在表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位到表中的数据,效率得到提高。

select ename from emp where ename = ‘SMITH’;

通过索引转换为:

select ename from emp where 物理地址 = 0x3;

8、索引的分类

  • 单一索引
    • 给单个字段添加索引
  • 复合索引
    • 给多个字段联合起来添加1个索引
  • 唯一索引
    • 有unique约束的字段会自动添加索引

9、索引什么时候失效

select ename from emp ename like '%A%';

模糊查询的时候,第一个通配符使用的%,这个时候索引是失效的,只能全表查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值