第23章(上)_索引原理之索引与约束

简介: 第23章(上)_索引原理之索引与约束

索引

索引的概念:索引是一种有序的存储结构。索引按照单个或多个列的值进行排序。

索引的目的:提升搜索效率。

索引分类

按照数据结构分为:

(1)B+树索引。

(2)自适应hash索引。主要用在内存当中,看MySQL缓冲中是否有数据。

(3)全文索引。将存储在数据库当中的整本书和整篇文章中的任意内容信息查找出来的技术;关键词 FULLTEXT;在短字符串中用 LIKE %;在全文索引中用 match 和against。一般不会用到;如果要用全文索引,会使用elasticsearch工具。

按照物理存储分为:

(1)聚集索引;或者称为聚簇索引。聚集索引是主键对应的那个B+树;会存储对应的行数据。

(2)辅助索引;或称为二级索引。比如通常设计的普通索引或组合索引,只有索引信息和主键ID信息,没有行数据。

按照列属性分为:

(1)主键索引。是一个非空唯一索引,一个表只有一个主键索引;在 innodb 中,主键索引的 B+ 树包含表数据信息。

PRIMARY KEY(key)

(2)唯一索引。不可以出现相同的值,允许出现null。

UNIQUE(key)

(3)普通索引。允许出现相同的索引内容。

INDEX(key)
-- or
KEY(key[...])

(4)前缀索引。只比较前几个字符的长字符串。

按照列的个数分为:

(1)单列索引。

(2)组合索引。对表上的多个列进行索引。

INDEX idx(key1,key2[,...]);
UNIQUE(key1,key2[,...]);
PRIMARY KEY(key1,key2[,...]);

主键选择

innodb 中表是索引组织表,每张表有且仅有一个主键。

  1. 如果显示设置 PRIMARY KEY,则该设置的 key 为该表的主键。
  2. 如果没有显示设置,则从非空唯一索引中选择。
    a. 只有一个非空唯一索引,则选择该索引为主键;
    b. 有多个非空唯一索引,则选择声明的第一个为主键;
  3. 没有非空唯一索引,则自动生成一个 6 字节的 _rowid 作为主键。
    说明:此时数据会按照插入的顺序存放到这个系统自动生成的聚集索引B+树中,这其实就相当于全表扫描时mysql的数据存放

索引的代价

(1)空间上:索引是一种存储结构,需要写入磁盘中,会占用空间,在工程应用中,一般不会超过8个索引。

(2)时间上:维护的代价,体现在DML操作会变慢,因为它要维护所有索引对应的B+树。

约束

为了实现数据的完整性,对于 innodb,提供了以下几种约束:primary key,unique key,foreign key,default,not null。

外键约束

外键用来关联两个表,来保证参照完整性;MyISAM 存储引擎本身并不支持外键,只起到注释作用;而 innodb 完整支持外键,并具备事务性。

create table parent (
   id int not null,
    primary key(id) ) engine=innodb;
create table child (
   id int,
   parent_id int,
    foreign key(parent_id) references parent(id) ON DELETE CASCADE ON UPDATE CASCADE
) engine=innodb;
-- 被引用的表为父表,引用的表称为子表;
-- 外键定义时,可以设置行为 ON DELETE 和 ON UPDATE,行为发生时的操作可选择:
-- CASCADE   子表做同样的行为
-- SET NULL 更新子表相应字段为 NULL
-- NO ACTION 父类做相应行为报错
-- RESTRICT 同 NO ACTION
-- 测试
INSERT INTO parent VALUES (1);
INSERT INTO parent VALUES (2);
INSERT INTO child VALUES (10, 1);
INSERT INTO child VALUES (20, 2);
DELETE FROM parent WHERE id = 1;

被引用的表为父表,引用的表称为子表。

外键定义时,可以设置行为 ON DELETE 和 ON UPDATE,行为发生时的操作可选择:

(1)CASCADE,子表做同样的行为。

(2)SET NULL, 更新子表相应字段为 NULL。

(3)NO ACTION ,父类做相应行为报错。

(4)RESTRICT 同 NO ACTION。

约束与索引的区别

创建主键索引或者唯一索引的时候同时创建了相应的约束;但是约束是逻辑上的概念;索引是一个数据结构既包含逻辑的概念也包含物理的存储方式。

索引使用场景

(1)使用where条件判断时,会使用索引。

(2)使用group by分组查询时,会判断后面的列是否创建了索引,如果创建了就会使用索引对应的B+树。

(3)使用order by时,会判断后面的列是否创建了索引,如果创建了就会使用索引对应的B+树。

不要使用索引的场景

(1)没有涉及到where、grop by、order by的使用,不用创建索引。

(2)区分度不高的列,没必要使用索引。

(3)经常修改的列,不要创建索引;因为维护代价太高。

(4)表的数据量少,没必要创建索引。

总结

一定要确定一个主键索引的原因是 主键索引对应的是聚集索引B+树,所有的数据要存储在主键对应的B+树中。

目录
相关文章
|
前端开发 JavaScript 数据库
layui联动菜单搜索select表单选项的设置方法
layui联动菜单搜索select表单选项的设置方法
950 0
|
11月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
832 3
Mysql高可用架构方案
|
机器学习/深度学习 自然语言处理 算法
利用机器学习算法进行自动化测试
利用机器学习算法进行自动化测试
|
机器学习/深度学习 人工智能 分布式计算
人工智能与大数据的融合应用##
随着科技的快速发展,人工智能(AI)和大数据技术已经深刻地改变了我们的生活。本文将探讨人工智能与大数据的基本概念、发展历程及其在多个领域的融合应用。同时,还将讨论这些技术所带来的优势与挑战,并展望未来的发展趋势。希望通过这篇文章,读者能够对人工智能与大数据有更深入的理解,并思考其对未来社会的影响。 ##
|
数据采集 并行计算 算法
LabVIEW与Matlab联合编程的途径及比较
LabVIEW与Matlab联合编程的途径及比较
353 0
LabVIEW与Matlab联合编程的途径及比较
|
人工智能 C# 云计算
C#编程的未来发展趋向
【4月更文挑战第21天】C#编程未来将深化跨平台支持,强化云计算与容器技术集成,如.NET Core、Docker。在AI和ML领域,C#将提供更丰富框架,与AI芯片集成。语言和工具将持续创新,优化异步编程,如Task、async和await,提升多核性能。开源生态的壮大将吸引更多开发者,共创更多机遇。
409 4
|
数据采集 机器学习/深度学习 PyTorch
PyTorch中的数据加载与预处理
【4月更文挑战第17天】了解PyTorch中的数据加载与预处理至关重要。通过`Dataset`和`DataLoader`,我们可以自定义数据集、实现批处理、数据混洗及多线程加载。`transforms`模块用于数据预处理,如图像转Tensor和归一化。本文展示了CIFAR10数据集的加载和预处理示例,强调了这些工具在深度学习项目中的重要性。
|
存储 Unix C语言
STM32--RTC实时时钟
STM32--RTC实时时钟
537 0
|
缓存 Linux 调度
CPU的亲和性
CPU的亲和性
533 0
|
NoSQL 安全 算法
redis6.0源码分析:字典扩容与渐进式rehash
redis6.0源码分析:字典扩容与渐进式rehash
341 0