MySQL数据库 ------索引+数据库的三大范式

文章目录

  • 一:索引的概念
    • 1.1:数据库索引
    • 1.2:索引的作用
    • 1.3:创建索引的好处与坏处
  • 二:索引的分类
  • 三:数据库的三大范式
    • 3.1:第一范式(1NF)
    • 3.2:第二范式(2NF)
    • 3.3:第三范式(3NF)

一:索引的概念

MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

1.1:数据库索引

  • 是一个排序的列表,存储这索引值和这个所对应的物理地址
  • 无须对整个表进行扫描,通过物理地址就可以找到所需数据
  • 是表中一列或则若干个值排序的方法
  • 需要额外的磁盘空间 相当于目录,方便查找 伴随着表存在的!
    面对于小量的数据/小篇幅量的数据不需要建立索引,300行以内的不要要建立索引,否则会占用空间)

1.2:索引的作用

  • 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率。
  • 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍。
  • 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本
  • 通过创建唯一性索引保证数据表数据的唯一性
  • 可以加快表与表之间的连接
  • 在使用分组和排序时,可大大减少分组和排序时间

1.3:创建索引的好处与坏处

①通过创建索引,可以在查询的过程中,提高系统的性能

②通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

③在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间
创建索引的坏处
①创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大

②索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大

③在对表中的数据进行增加删除和修改时需要耗费较多的时间,因为索引也要动态地维护

二:索引的分类

普通索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

◆创建索引

CREATE INDEX indexName ON mytable(username(length)); 

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
创建唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下创建方式:

CREATE UNIQUE INDEX indexName ON mytable(username(length)) 

主键索引

  • 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
PRIMARY KEY(ID)  
 
); 

组合索引(单列索引和多列索引

  • 索引可以是单列上创建的索引,也可以是在多列上创建的索引

全文索引

  • 在MySQL中,全文索引的索引类型为FULLTEXT,全文索引可以在VARCHAR或者TEXT类型的列上创建。

创建索引的原则依据

  • 表的主键 、外键必须有索引
  • 记录数超过300行的表应该有索引
  • 经常与其他表进行连接的表,在连接字段上应该建立索引
  • 唯一性太差的字段不适合建立索引
  • 更新太频繁的字段不适合创建索引

删除索引语法

DROP INDEX index——name ON table——name
ALTER TABLE table——name DROP INDEX index——name;

示例

mysql> drop index shu_index on hei;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
#在查看索引
mysql> show index from hei\G;
..已删除

三:数据库的三大范式

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。

满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)

3.1:第一范式(1NF)

第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。
1NF是对属性的原子性,要求属性具有原子性,不可再分解;

举例说明

MySQL数据库 ------索引+数据库的三大范式_第1张图片

在上面的表中,”家庭信息“和”学校信息学“列均不满足原子性的要求,故不满足第一范式,调整如下:
MySQL数据库 ------索引+数据库的三大范式_第2张图片

可见,调整后的每一列都是不可再分的,因此满足第一范式(1NF);

3.2:第二范式(2NF)

  • 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
  • 第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

举例说明:
MySQL数据库 ------索引+数据库的三大范式_第3张图片

  • 在上图所示的情况中,同一个订单中可能包含不同的产品,因此主键必须是“订单号”和“产品号”联合组成,
  • 但可以发现,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,
  • 这样就不满足第二范式的要求,调整如下,需分成两个表:
    MySQL数据库 ------索引+数据库的三大范式_第4张图片
    MySQL数据库 ------索引+数据库的三大范式_第5张图片

3.3:第三范式(3NF)

  • 在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
  • 第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

举例说明:

  • 上表中,所有属性都完全依赖于学号,所以满足第二范式,但是“班主任性别”和“班主任年龄”直接依赖的是“班主任姓名”,

而不是主键“学号”,所以需做如下调整:
MySQL数据库 ------索引+数据库的三大范式_第6张图片
MySQL数据库 ------索引+数据库的三大范式_第7张图片

这样以来,就满足了第三范式的要求。

ps:如果把上表中的班主任姓名改成班主任教工号可能更确切,更符合实际情况,不过只要能理解就行。

你可能感兴趣的:(云计算,索引,数据库,mysql,索引,运维)