Mysql数据库之索引与视图

学习目的

  1. 了解数据库索引和视图的概念
  2. 了解索引的分类与作用
  3. 掌握如何定义数据库索引及使用(创建索引、删除索引)
  4. 掌握添加索引的时机(满足使用索引条件)

一.索引

  1. 数据库表的检索方式
  • 全表扫描:一张表一张表逐个扫描,从第一条扫描到最后一条记录(加入有千万级条数据),数据效率低下;
  • 索引检索(效率很高):类似字典的目录,提前缩小扫描范围,扫描的数据量较小。

1.1 索引

  1. 概念
    索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。索引的根本原理是提前缩小查找的范围。
  2. 分类
  • 单一索引:给单个字段添加索引;
  • 复合索引:给多个字段联合起来添加1个索引;
  • 主键索引:主键上会自动添加索引;
  • 唯一索引:有unique约束的字段上会自动添加索引。
  1. 原理
    索引底层采用B+Tree数据结构,其最根本的原理是缩小字段扫描的范围。通过B Tree缩小扫描范围,底层索引对索引字段的字段值进行了排序、分区。索引会携带数据 在表中的"物理地址" -- 数据在硬盘中的位置编号,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是非常高的。


    索引原理.png
  2. 使用条件(满足使用索引的条件)

  • 表的数据量庞大:根据客户的需求,根据线上的环境;
  • 该字段很少的DML操作:因为字段进行修改操作,索引也需要维护,索引随数据的修改而修改(类似于字段目录,当姓氏改变,目录也要改变);
  • (添加了索引的)该字段经常出现在where子句中:索引是根据哪个字段经常作为关键字查询,才对该字段添加索引,不经常出现的字段或不出现的字段也要添加索引时反而会降低效率。
  1. 特点
    主键和具有unique约束的字段自动会添加索引,因此根据主键查询效率较高,尽量根据主键检索。
  2. 索引失效
  • 索引字段查找时,采用模糊查询,且模糊查询字段值的首位采用 %号,因为 %号代表任意值,因此不能精确定位索引的 具体区,从而会进行全局索引扫描。

1.2 索引的使用

1.2.1 索引创建

  1. 语法格式
create index 索引名称 on 表名(字段名);
  1. 代码示例
// 给emp表的sal字段添加索引
mysql> create index emp_sal_index on emp(sal);

// 使用索引查询
mysql>  explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key           | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
|  1 | SIMPLE      | emp   | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 | Using where |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+

1.2.2 索引删除

  1. 语法格式
drop index 索引名称 on 表名;  // MySQL删除索引

drop index 索引名称;  // Oracle删除索引,不需要带表名

二.视图

  1. 概念
    视图是一个提供给用户站在不同的角度去看到数据的"简略工具"。同一张表的数据,通过不同的角度去看待。
  2. 本质
    视图是一张简略的原表,是原表的缩小版(原因是视图通过select语句创建)。
  3. 原理
    只有DQL语句(select语句)才能以视图对象的方式创建出来,类似于表的复制。
  4. 使用
  • 由于视图是一张"简略表",因此也可以对视图进行CRUD,并且对视图的CURD会影响原表的数据(通过缩小版的表 对原表进行操作影响);
  • 视图可以隐藏原表的实现细节;
  • 外包公司可能只是使用原公司提高的视图,外包只对视图进行更新维护;
  • 保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD。

2.1 视图的使用

2.1.1 创建视图

  1. 语法格式
create view 视图名 as DQL语句;  // 视图的创建

create table 表名 as DQL语句;  // 表的复制

2.2 使用视图

  1. 语法格式
select 字段 from 视图名;  // 通过视图查询原表字段
select 字段 from 视图名 where 条件子句;  // 
update 视图名 set 字段1='值1',字段2=值2 where 条件子句; // 通过视图修改原表数据
delete from 视图名 where 条件子句; // 通过视图删除原表数据
  1. 代码示例
// 通过视图查询原表数据
select * from myview;
// 通过视图查询原表数据
select ename,sal from myview where empno = 7369;
// 通过视图修改原表数据
update myview set ename='hehe',sal=1 where empno = 7369; 
// 通过视图删除原表数据
delete from myview where empno = 7369; 

2.3 删除视图

  1. 语法格式
drop view 视图名;

重点:explain关键字(Execute plain)

  1. 描述
    explain关键字全称Execute plain,意为执行计划,是用于查看SQL语句执行情况的关键字。通过 explain SQL语句 可以查看出每一条SQL语句是如何进行执行的。explain查看SQL的执行情况以表格形式表现出来。
  2. 使用格式
explain SQL语句

// 示例--type为ALL:全表查询
mysql> explain select * from t_user;
执行id 查询类型      目标表    扫描方式  可能的关键字    关键字  关键字长度  参考   扫描行数  备注
+----+-------------+--------+------+---------------+------+---------+------+------+-------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | t_user | ALL  | NULL          | NULL | NULL    | NULL |    2 |       |

// 示例--type为ref:索引查询
mysql>  explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key           | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
|  1 | SIMPLE      | emp   | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 | Using where |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
  1. 查看重点
  • type: 可以查看出该SQL语句执行的扫描方式,全表扫描或索引扫描;
  • select_type: 查看该SQL语句执行的查询方式,简单查询、子查询、连接查询或相加查询(union相加);

你可能感兴趣的:(Mysql数据库之索引与视图)