目录

  • 一、索引
  • 1. 概念
  • 2. 索引分类
  • 3. Mysql查询的两种方式
  • 4. 索引的实现原理
  • 5. 什么情况下添加索引?
  • 6. 如何创建与删除索引?
  • 7. 索引失效
  • 二、 视图
  • 1. 概念
  • 2. 特点
  • 3. 用法
  • 4. 作用
  • 5. 注意
  • 三、数据库设计三范式
  • 1. 什么是数据库设计范式?
  • 2. 数据库设计三范式
  • 3. 数据库设计口诀
  • 4. 注意



一、索引

1. 概念

索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。

2. 索引分类

单一索引:一个字段上添加索引。
复合索引:两个字段或者更多的字段上添加索引。
主键索引:主键上添加索引。
唯一性索引:具有unique约束的字段上添加索引。
注意:唯一性比较弱的字段上添加索引用处不大。

3. Mysql查询的两种方式

第一种方式:全表扫描
第二种方式:根据索引检索。
实际中,汉语字典前面的目录是排序的,按照a b c d e f…排序,为什么排序呢?因为只有排序了才会有区间查找这一说!(缩小扫描范围其实就是扫描某个区间罢了!)在mysql数据库当中索引也是需要排序的,并且这个所以的排序和TreeSet数据结构相同。TreeSet(TreeMap)底层是一个自平衡的二叉树!在mysql当中索引是一个B-Tree数据结构。遵循左小又大原则存放。采用中序遍历方式遍历取数据。

4. 索引的实现原理

1.在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是PK。另外在mysql当中,一个字段上如果有unique约束的话,也会自动创建索引对象。
2.在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
3.在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中。不管索引存储在哪里,索引在mysql当中都是一个树的形式存在。(自平衡二叉树:B-Tree)

5. 什么情况下添加索引?

在mysql当中,主键上,以及unique字段上都会自动添加索引的

条件1:数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)
条件2:该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。
条件3:该字段很少的DML(insert delete update)操作。(因为DML之后,索引需要重新排序。)

建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的。

6. 如何创建与删除索引?

创建: 
   create index 索引名 on 表(字段);
删除
   drop index 索引名 on 表;

7. 索引失效

情况1 :
   select * from emp where ename like '%T';
   原因是模糊匹配当中以“%”开头
情况2 : 
   使用or的时候会失效,如果使用or那么要求or两边的条件字段都要有
   索引,才会走索引
情况3 :
   使用复合索引的时候,没有使用左侧的列查找,索引失效 
情况4 :
   在where当中索引列参加了运算,索引失效
情况5 :
   在where当中索引列使用了函数

二、 视图

1. 概念

视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

2. 特点

我们可以面向视图对象进行增删改查,对视图对象的增删改查,会导致原表被操作.

3. 用法

1. 创建视图
create view user_view from t_user;
2. 查询视图
select ... from user_view;
3. 面向视图插入数据
insert into user_view values(...);
4. 删除视图数据
delete from user_view;//把视图当成表即可

4. 作用

关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询只需要遍历一个表,而复杂的多表查询需要将多个表连接起来进行查询任务。对于复杂的查询事件,每次查询都需要编写MySQL代码效率低下。为了解决这个问题,数据库提供了视图(view)功能。

5. 注意

视图对象对应的语句只能是DQL语句。但是视图对象创建完成之后,可以对视图进行增删改查等操作。

三、数据库设计三范式

1. 什么是数据库设计范式?

数据库表的设计依据。教你怎么进行数据库表的设计。

2. 数据库设计三范式

第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。

第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。

第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。

3. 数据库设计口诀

1. 多对多, 三张表, 关系表两个外键
2. 一对多,两张表,多的表加外键
3. 一对一,外键唯一(如数据量太大, 一张表放不下, 需要将一张表拆分成两张)

4. 注意

数据库设计三范式是理论上的。
实践和理论有的时候有偏差。
最终的目的都是为了满足客户的需求,有的时候会拿冗余换执行速度。
因为在sql当中,表和表之间连接次数越多,效率越低。(笛卡尔积)
有的时候可能会存在冗余,但是为了减少表的连接次数,这样做也是合理的,
并且对于开发人员来说,sql语句的编写难度也会降低。