玩转Mysql 七 (索引的创建与设计原则)

news2024/9/24 5:26:45

一、索引的创建与使用

1、索引的分类

MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
(1)从 功能逻辑 上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。
(2)按照 物理实现方式 ,索引可以分为 2 种:聚簇索引和非聚簇索引。
(3)按照 作用字段个数 进行划分,分成单列索引和联合索引。

2、mysql索引的拓扑图

3、mysql索引概述

索引是排好序的数据结构,能够就少I/O次数。
MySQL-INNODB引擎使用B+树数据结构作为索引。
B树和B+树最大的区别是将数据存储到了叶子节点,并且叶子节点之间用指针相连。

  • 主键索引PRIMARY KEY:不为空、不能重复
  • 唯一索引UNIQUE:可为空,不能重复
  • 普通索引INDEX:加速查找
  • 联合索引:PRIMARY KEY(id,name):联合主键索引 UNIQUE(id,name):联合唯一索引INDEX(id,name):联合普通索引

4、创建索引的三种方式

(1)创建表时同时创建索引

CREATE TABLE users(
userid INT ,
username VARCHAR(100),
age YEAR,
email VARCHAR(100),
INDEX email_inx(email) 
);

(2)创建完表后再单独一列创建索引

CREATE INDEX name_inx ON users(username);

(3)将表的一列更改为索引

ALTER TABLE users ADD INDEX age_index(age);

4、查看表的索引

方式一:SHOW INDEX FROM users;

方式二:

SHOW CREATE TABLE users \G;

SHOW CREATE TABLE users ;

二、索引类型的优缺点

1、普通索引

普通索引是数据库中最基本的索引结构,也被称为单列索引或简单索引。它只包含一个列的值和指向该行的指针,用于加速对该列的单列查询。可以对表的任意列创建普通索引,但通常建议对经常进行查询和排序的列创建索引,例如主键列和外键列等。

普通索引的原理是将所需要查询的列作为索引列,按照索引列的值建立索引。当查询该列时,数据库系统会先在索引结构中进行查找,然后根据索引中的指针到数据表中找到对应的行。由于普通索引只包含一个列的值和指向该行的指针,因此查询时需要在数据表中找到其他所需的列的值。

普通索引的优点包括:

(1)可以加速单列查询的速度,特别是对于大型数据表和频繁的查询操作。

(2)可以提高数据的访问效率,从而加快数据的处理速度。

普通索引的缺点包括:

(1)当需要查询的列不在索引列中时,需要进行额外的查找操作,从而降低查询效率。

(2)创建普通索引需要占用额外的磁盘空间和内存空间,可能会对写入操作的性能产生一定的影响。

普通索引的使用场景包括

(1)经常进行查询和排序操作的列。

(2)需要经常进行连接操作的表的外键列。

(3)数据表中需要保证唯一性的列,如主键列等。

普通索引是数据库中最基本的索引结构,用于加速对单列查询的速度,提高数据的访问效率。在创建普通索引时需要根据具体的业务需求进行选择,避免对写入操作的性能产生过大的影响。

示例:创建普通索引

在book表中的year_publication字段上建立普通索引,SQL语句如下:
(1)在创建表中创建索引

(2)查看索引信息

方式一 :SHOW INDEX FROM users;

方式二:

(3)删除索引

方式一:ALTER  TABLE  表名称  DROP  索引名称;

ALTER TABLE users DROP INDEX   email_inx;

方式二:DROP  INDEX  索引名称  ON  表名称;

DROP INDEX name_inx ON users; 

2、唯一索引

唯一索引是一种限制数据库表中列值唯一性的索引,用于保证在指定列上没有重复的数据。与普通索引不同,唯一索引在索引列中的每个值都是唯一的,且不允许插入重复值,包括 NULL 值

唯一索引的原理与普通索引类似,只是对于唯一索引而言,如果插入或更新操作的列值已经存在,数据库系统会抛出一个唯一性冲突的错误。唯一索引可以用于加速唯一性约束条件的验证(创建唯一性索引会默认创建唯一性约束,反之亦然),从而提高数据的访问效率。

唯一索引的优点包括:

(1)可以保证数据表中的列值唯一性,避免重复数据的插入。

(2)可以提高数据的访问效率,加速唯一性约束条件的验证。

唯一索引的缺点包括:

(1)创建唯一索引需要占用额外的磁盘空间和内存空间,可能会对写入操作的性能产生

        一定的影响。

(2)如果需要对多个列进行唯一性约束,需要创建多个唯一索引,会占用更多的磁盘空间和

         内存空间。

唯一索引的使用场景包括:

(1)需要对数据表中的某一列或多个列进行唯一性约束的情况。

(2)经常进行查询和排序操作的列需要保证唯一性。

唯一索引是一种用于限制数据库表中列值唯一性的索引,可以保证数据表中的列值唯一性,提高数据的访问效率。在创建唯一索引时需要根据具体的业务需求进行选择,避免对写入操作的性能产生过大的影响。

创建唯一索引的两种方式:

方式1:建立表时创建

CREATE TABLE users2(
userid INT    ,
username VARCHAR(100),
age YEAR,
email VARCHAR(100),
UNIQUE INDEX  use_idx_id(userid)
);

方式2:建立表后再指定的列上创建

ALTER TABLE users2 ADD UNIQUE use_idx_id(userid);

(3)普通索引 VS 唯一索引的展示对比

(4)删除唯一索引

方式一:DROP INDEX index_name on  table_nam;

DROP INDEX use_idx_id on users2;

方式二:ALTER TABLE table_nam DROP INDEX use_idx_id;

ALTER TABLE users2 DROP INDEX use_idx_id;

测试唯一索引:插入重复的值

SELECT * FROM users2;

INSERT INTO users2(userid,username,age,email)  VALUE ('1','jack','18','tom.126.com');

测试唯一索引:插入NULL 值

INSERT INTO users2(userid,username,age,email) 
VALUE(null,'jack','18','jack.126.com');

唯一索引可以插入NULL值,建表时需要注意

3、主键索引

主键索引是一种基于数据库表中主键的索引技术,主要用于加速对数据库表中某个记录的查找和访问。主键是一种唯一标识数据库表中每个记录的字段或一组字段,每个记录都应该具有不同的主键值,主键是一种特殊的唯一索引,必须指定为"PRIMARY KEY"。 一个表只能有一个主键,不允许有空值。添加主键将自动创建主键索引。

主键索引通常使用B+树等数据结构进行实现,以便能够快速地查找和定位某个记录。

主键索引的特点包括:

(1)主键索引是一种唯一索引,要求每个记录的主键值都是唯一的。

(2)主键索引通常是表中的主键字段上创建的索引,可以加快对该字段的查找和访问速度。

(3)主键索引可以用于加速数据库表的连接操作和数据的排序操作。

主键索引的优点包括:

(1)提高了对数据库表中某个记录的查找和访问速度,降低了访问数据库表的成本。

(2)由于主键值是唯一的,可以保证每个记录都能被唯一地标识和访问。

(3)可以用于加速数据库表的连接操作和数据的排序操作,提高了查询和分析数据的效率。

主键索引的缺点包括:

(1)主键索引只适用于基于主键的查询,对于其他类型的查询可能会不够高效。

(2)在插入新记录或更新主键值时,需要重新维护主键索引,可能会对数据库性能产生影响。

(3)如果主键值不够唯一或者数据量较大,主键索引可能会占用较多的磁盘空间和内存空间。

主键索引是一种基于数据库表中主键的索引技术,可以提高对数据库表中某个记录的查找和访问速度,用于加速数据库表的连接操作和数据的排序操作。在使用主键索引时需要考虑到其对于其他类型的查询可能不够高效,以及在插入新记录或更新主键值时需要重新维护主键索引的成本。MySQL 主键索引还是聚簇索引。

创建主键索引的方式

方式一:建表时同时创建

CREATE TABLE users3(
userid INT(10) PRIMARY KEY  ,
username VARCHAR(100),
age YEAR,
email VARCHAR(100)
);
方式二:建表后创建

ALTER TABLE users3 ADD CONSTRAINT  PRIMARY KEY (userid);

   删除主键索引

ALTER TABLE table_name DROP PRIMARY KEY;

ALTER TABLE users3 DROP PRIMARY KEY;

测试主键索引

  

测试插入重复值

INSERT INTO users3(userid,username,city,email) 
VALUE('1','jack','hb','tom.126.com');

测试插入空值

INSERT INTO users3(userid,username,city,email) 
VALUE(NULL,'jack','hb','tom.126.com');

3、复合(联合)索引

复合索引是一种将多个列组合在一起来创建的索引,用于优化查询中涉及到多个列的查询效率。相对于单列索引,复合索引可以更有效地支持多列的查询,提高查询效率。

在创建复合索引时,可以选择多个列,并按照顺序依次排列。这样可以使得查询更加高效,因为复合索引的叶子节点存储的是多列的值,可以直接满足多列查询的需求,避免了查询时多次进行索引扫描的开销。

例如,对于一个包含姓名和年龄的表,可以创建一个复合索引,将这三列按照顺序依次排列。这样,当需要查询姓名、性别和年龄都满足一定条件的记录时,可以直接使用复合索引来完成查询,避免了多次索引扫描的开销,从而提高了查询效率。

复合索引的优点包括

(1)可以提高多列查询的效率,避免多次索引扫描的开销。

(2)可以减小索引的存储空间,适用于需要对多个列进行查询的表。

复合索引的缺点包括

(1)复合索引的维护成本比单列索引高,因为需要对多个列进行维护。

(2)对于一些单列查询,复合索引可能并不适用,因为需要扫描复合索引的叶子节点,而单列索引可以直接定位到需要的记录。

复合索引的使用场景包括:

(1)需要对多列进行查询的表,例如包含姓名和年龄等多个列的表。

(2)查询操作较多,更新操作较少的表。

创建联合索引方式

方式一:创建表时创建

CREATE TABLE test3(
id INT(11) NOT NULL,
name CHAR(30) NOT NULL,
age INT(11) NOT NULL,
info VARCHAR(255),
INDEX multi_idx(id,name,age)
);

方式二:创建表后增加

ALTER TABLE test3 ADD INDEX multi_idx(id,name,age);

删除联合索引

DROP INDEX multi_idx ON test3;

4、全文索引

全文索引是一种基于文本内容的索引技术,可以快速地检索出包含指定关键词或短语的文档或记录,只支持VARCHAR/CHAR类型数据。相比于传统的索引技术,全文索引更加适用于文本数据的搜索和查询。

全文索引通常使用倒排索引(Inverted Index)的数据结构,将每个单词或短语出现的位置作为索引项,以便进行快速的查找和匹配。倒排索引可以理解为是一张单词词表,每个单词都指向包含该单词的文档或记录的位置。通过倒排索引,可以快速地找到包含指定单词的文档或记录,以及它们出现的位置。

全文索引的优点包括:

(1)可以对文本数据进行高效的搜索和查询,提高数据的访问效率。

(2)可以支持模糊搜索和短语搜索等功能,增强搜索的灵活性和准确性。

全文索引的缺点包括:

(1)创建全文索引需要占用大量的磁盘空间和内存空间,可能会对系统的性能产生影响。

(2)全文索引的更新和维护成本较高,需要花费较多的时间和资源。

全文索引的使用场景包括:

(1)需要对大量文本数据进行搜索和查询的情况,如新闻、博客、社交媒体等应用。

(2)需要支持模糊搜索和短语搜索等高级搜索功能的情况。

全文索引是一种基于文本内容的索引技术,可以高效地对文本数据进行搜索和查询,支持模糊搜索和短语搜索等高级搜索功能。在使用全文索引时需要考虑到其占用的磁盘空间和内存空间,以及更新和维护的成本。

创建全文索引

CREATE TABLE test5 (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR (200),
body TEXT,
FULLTEXT INDEX  full_idx (title, body)
) ENGINE = INNODB ;

SHOW INDEX FROM test5;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1380681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模拟日光AR汽车HUD的光学特性太阳光模拟器

AR HUD 的光学特性 几何光学可描述物体、透镜和成像之间的关系。将物体放在透镜及其焦点之间将会形成放大且离实际物体有一定距离的虚像[4]。这便是 HUD 生成虚像的方法。源物体(在这里是散射屏或 TFT 面板)在 HUD 反光镜光学系统的焦距内。这使相应虚像…

(学习日记)2024.01.13:一份关于自行车定位的调研 2

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

【文献解读】“MOBILEViT:轻量级、通用目的、移动友好的视觉变换器”。

今天阅读这篇2022年ICLR会议上发表的论文,主要是为了学习MobileViT模型,用于YOLO模型主干改造。 一、文献概述 作者:Sachin Mehta 和 Mohammad Rastegari。地点:作者所属机构是 Apple。内容简述: 提出了一种名为Mob…

用模方软件进行模型的透明贴图,为什么翻出来透明部分是黑的?

答:透贴需要用PNG格式。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能,支持一键自动提取房屋结构,平均1栋复杂建筑物只需3…

shell中echo和printf在终端输出时更改文本颜色

shell中更改echo或printf的输出颜色可以使用相应的ANSI转义码(ANSI Escape Codes)来实现:各种常用颜色的ANSI如下所示,截图来自于 geeksforgeeks.org 八进制格式应采用以下格式给出:八进制格式必须以名为\033[的参数为前缀,后跟需要指定的颜色…

地图多点自动缩放,居中,思路和手写

效果如下 多个标记点顺次标记连接起来zoom缩放到合适等级,刚好能放下那么多点视野刚好在正中间 zoom 实现思路 获取多点的最大经纬度点和最小经纬度点(这两个点相距离最远)计算2个这两点之间的距离地图是有比例尺的,根据比例尺…

AI软件开发:探索原理、挑战与未来趋势

AI软件开发已经成为当前最热门和具有前景的技术领域之一。随着人工智能技术的快速发展,AI软件的应用范围也在不断扩大。本文将主要探讨AI软件开发的原理、挑战以及未来的趋势。 首先,AI软件开发的原理是基于机器学习和深度学习算法。机器学习是一种通过…

基于SSM+vue的篮球场预约管理系统(Java毕业设计)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

计算机毕业设计----Springboot超市订单管理系统

项目介绍 该超市订单管理毕业设计基于jdk8版本开发,在部署时需要使用jdk8以上的版本。使用了目前流行的框架组合springbootmybatis的框架技术, 实现了供应商管理对供应商实现增删改查、订单管理对超市订单实现增删改查、用户管理等功能,适用…

Docker五部曲之一:容器术语介绍

文章目录 前言背景基本术语容器镜像容器镜像格式容器引擎容器容器主机注册中心容器编排 进阶术语容器运行时镜像层标签存储库名称空间 参考 前言 本文内容翻译自参考文献。 背景 要理解容器术语,重要的是要精确地理解容器是什么。容器实际上是两个不同的东西。像…

MySQL基础学习: 使用EXPLAIN查看执行计划详解分析

一、EXPLAIN语句的作用 在客户端执行MySQL的操作语句,会依次经过MySQL客户端连接管理、语法解析与优化(查询缓存、语法解析、查询优化)、存储引擎层。其中查询优化器在基于成本和规则对查询语句进行优化,并且在优化后会生成一个执…

安装、运行和控制AI apps在您的计算机上一键式

pinokio 你是否曾为安装、运行和自动化 AI 应用程序和大模型而感到困惑?是否希望有一个简单而强大的工具来满足你的需求?如果是这样,那么 Pinokio 将会是你的理想选择!Pinokio 是一款革命性的人工智能浏览器,是一个开…

51单片机点阵开发

一.LED点阵屏 LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏、银行窗口屏叫号屏以及停车系统等等。 …

牛客(JZ36 二叉搜索树与双向链表)

题目链接 思路1:使用中序遍历, 创建一个cur记录当前结点,prev记录上一个结点,这样cur->left prev,prev->right cur, 这样就链接 成功了。 难点:需要使用引用来控制prev。 /* struct T…

C# IOC 容器实战:KeyedService和生命周期

文章目录 前言KeyedServiceKey缺少Key值覆盖 KeyedService.AnyKey生命周期测试代码 总结 前言 我之前写过一篇Ioc容器的使用,用的是微软的IOC容器。这次我们再去深入了解一下IOC 和控制反转 .NET Core 依赖注入 Microsoft.Extensions.DependencyInjection ASP.NET …

js 实现拖动按钮添加布局

效果&#xff1a; h布局生成左右布局&#xff0c; v布局生成上下布局 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, ini…

【MATLAB源码-第104期】基于matlab的MPSK和MQAM调制解调方式仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 MPSK&#xff08;多相位键控&#xff09; MPSK是一种基于载波相位变化的数字调制技术。它的核心原理是通过改变载波的相位来表示不同的数字信息。这种技术可以分为几个不同的级别&#xff0c;其中最常见的包括&#xff1a; 1…

用sql计算两个日期的间隔天数 ,去除周末

快递行业&#xff0c;经常需要计算2个节点的时效&#xff0c;有的计算自然日&#xff0c;有时候需要计算去掉周末的时效&#xff0c;计算自然日很简单&#xff0c;用函数datediff 就可以了&#xff0c;计算工作日时效&#xff0c;我的实现方法如下&#xff0c;借助了一个日期维…

GSTAE

缺失数据的流量预测:一种多任务学习方法 摘要:基于真实交通数据的交通速度预测是智能交通系统(ITS)中的一个经典问题。大多数现有的交通速度预测模型都是基于交通数据完整或具有罕见缺失值的假设而提出的。然而,由于各种人为和自然因素,在现实场景中收集的此类数据往往是…

NUS CS1101S:SICP JavaScript 描述:二、使用数据构建抽象

原文&#xff1a;2 Building Abstractions with Data 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 我们现在来到数学抽象的决定性步骤&#xff1a;我们忘记符号代表什么。…[数学家]不需要闲着&#xff1b;他可以用这些符号进行许多操作&#xff0c;而无需看它们所代…