2.5 数据库索引机制

news2024/11/13 9:11:20

我们往数据表里面保存数据记录越来越多,一旦达到上千万条,那怎么提高检索速度就需要认真考虑了。我们打开手机上的APP都希望能快些加载出内容,这里的因素有很多,但是如何减少数据查找的时间是其中的重要一环。索引机制就是提升数据检索速度的,其实它的原理非常的简单,那就是对数据排序。一旦数据排序之后,查找的速度就会翻倍。举一个现实生活中的例子,我们想查找机会这个英文单词,但是我只记得开头儿是op,后面儿怎么拼写已经不记得了,如果你拿到一本儿英文词典会怎么办?快速定位到O开头儿单词的区间,小范围查找opportunity这个单词,如果英文词典里的单词都没有排序,全是乱序的,那我们可能会疯掉。查一个单词就要从词典的第一页儿翻到最后一页儿,因为你不知道哪一页儿会有opportunity这个单词出现。

把话题再收回到数据库这边,数据表中的记录都是默认按照主键来排序的,所以按照主键查找记录的速度就很快了。虽然说主键有序了,但不代表其他的字段也是有序的。比如说姓名这个字段吧,它就是乱序的。如果说按照姓名去查找员工,记录这种条件查询很频繁,那就应该给姓名字段加上索引,以便提升查找的速度,这背后的原理跟查找单词是很像的。姓王的和姓王的人排在一起,姓李的和姓李的记录排在一起,我们查找王刚这个人,那就只需要在姓王的群体里面查找就好了呀,所以这个查找就是一个小范围的查找,而不是全表查找。

创建索引有两种办法,第一种是创建数据表的时候添加上,另外一种是建表之后再添加索引,那我就先说一下建表的时候怎么去设置索引吧。

一、创建索引

1.1 创建数据表的时候添加

索引都是有名字,你规定上名字,那就用你规定的这个名字,你不规定这个名字,我就用字段的名字。那么创建一个索引之后,再往下后面儿还可以定义其他字段的索引,甚至是外界约束

咱们创建一张表儿,使用一下索引这种机制,那这张数据表儿比如说是消息通知表儿吧,那么它叫做t_message,

第一个字段是主键是ID说过了,主键最好使用int类型,因为这个数字类型比varchar类型要好很多,速度也非常的快,然后给它加上这个primary key的主键约束。

再往下就是消息的内容content,然后这个消息也不是很长,比如说要求最多200个字符,然后是必须的填写数据的是not null好了

再往下就是消息的类型type,那这个消息类型,我用一下枚举,几种类型儿,比如说是公告这种类型,然后再往下还有是通报,个人通知,不为空

再往下,还有一个消息的创建时间是create time字段,然后类型儿就时间戳吧,因为我们的这个消息肯定都是1970年之后的这个消息了,所以用这个timestamp这个时间戳儿是没有问题的

所以说,一旦这个t_message数据表里边的记录特别多的时候,如果按照类型去查找消息的记录,那这个速度可能会比较慢,但是我加上索引之后,再根据type这个字段查找记录,就非常快了,好了,那我把这个index关键字给引进来对吧,对type进行索引

CREATE TABLE t_message(
  id INT UNSIGNED PRIMARY KEY,
  content VARCHAR(200) NOT NULL,
  type ENUM("公告","通报","个人通知") NOT NULL, # 枚举3中类型
  create_time TIMESTAMP NOT NULL,   # 创建时间用时间戳
  INDEX inx_type(type)               # 给type加上索引
);

1.2 建表之后再添加索引

如果数据表已经存在了,那么我们怎么给这个数据表儿的某个字段添加索引?

  • 用到的这个语法叫做create index写上索引的名称,然后on某一个表,某一个字段要添加索引,那你把表名和字段名称写上去就可以了。

  • 还有一种给这个已经存在的表添加索引的写法,叫做alter table,然后写上表的名称add index,然后索引的名称还有是字段的名称

这两种语法都可以对已经存在的数据表添加索引,

如果说索引加上去以后,我现在想看一下某一张数据表儿都设置了哪些索引,那么用的这个语法叫做show index from,然后写上表名,就可以查看这个数据表的所有索引了。

如果说索引我加错了,或者说这个索引我不想要了,可不可以把它删掉?可以,注意不是删除数据列,是把这个列的索引给删掉,那索引删掉以后就意味着这个索引对应的二叉树也就被删掉了,那么删除索引的语法叫做drop index,然后写上索引的名称on表名称就可以了

下面我们先删除一下刚刚创建的表的索引,然后再重新添加一下

# 删除索引
DROP INDEX inx_type ON t_message
# 重新添加索引
CREATE INDEX inx_type ON t_message(type)
# 查看索引
SHOW INDEX FROM t_message

1.3 设置索引的原则

第一个原则是针对于那些记录很多,而且经常被用来检索数据的表,我们挑选常用的检索字段作为索引,如果说数据表儿的记录很少,千800条根本不用去设置索引,就算数据库做全表儿扫描也是非常快的。因此,不用去设置索引,毕竟你设置完索引以后,数据表儿还要额外去维护二叉树,还是有一定的计算开销的,所以说数据少的时候根本就用不着去设置索引,另外,如果说数据表儿的记录虽然很多,但是数据的写入次数远远超过了查询,那么也是不适合创建索引的,比如说日志表吧,记录非常多的用户操作,但是业务上很少去查询日志表的数据,只是拿日志表作为一个行为的备案索引是提升检索速度的日志表,既然被很少查询,所以说就根本不用去设置索引了。

第二个原则,是指挑选那些常用来作为检索条件的字段去设置索引,比如说姓名,部门编号等字段都是经常拿来作为检索条件的。切记,把一张表的所有字段都去创建索引,那可真就是过犹不及了。数据库维护这么多的二叉树,计算成本还是非常高的。

第三个原则,就是不要在大字段类型上去创建索引。比如说长度超过50个字符的字符串儿就不适合设置索引了,因为字符越多,字符串排序的时间就越长,所以不建议在大字段类型上去创建索引。

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

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

相关文章

【内网渗透】最保姆级的春秋云镜Privilege打靶笔记

目录 flag1 flag2 flag3 flag4 flag1 fscan扫外网 访问./www.zip拿到源码 tools/content-log.php存在任意文件读取 根据提示读到Jenkins初始管理员密码 ./tools/content-log.php?logfile../../../../../../../../../ProgramData/Jenkins/.jenkins/secrets/initialAdminP…

第十一章 【后端】商品分类管理微服务(11.5)——增强响应

11.5 增强响应 在前后端分离的开发模式下,我们一般会统一后端的响应格式,比如自定义 Response 结构,但每个开发者可能会封装各自的 Response 结构,造成不一致,因此我们需要将响应格式统一起来,定义一个统一的标准响应格式。 11.5.1 创建响应模块 新建 yumi-etms-respon…

AJAX Jquery $.get $.post $.getJSON

AJAX AJAX Asynchronous JavaScript and XML (异步的J avascript和XML)。 Ajax $.ajax <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

【Linux进程控制】进程程序替换

目录 进程程序替换 替换函数 看现象 替换原理 多进程替换 exec*函数使用&#xff08;部分&#xff09;&#xff0c;并且认识函数参数的含义 1.execl 2.execv 3.execvp 4.execvpe execlp 和execlpe 替换函数总结 进程程序替换 替换函数 有六种以exec开头的函数&am…

AI大语言模型的全面解读

大语言模型&#xff08;Large Language Models, LLMs&#xff09;无疑是近年来最耀眼的星辰之一。他们以惊人的语言生成能力、上下文理解能力以及对复杂任务的泛化能力&#xff0c;正在深刻改变着自然语言处理&#xff08;NLP&#xff09;乃至整个AI领域的格局。 本文将从专业角…

螺栓与散装物体检测系统源码分享

螺栓与散装物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

代理模式-动态代理

一、代理模式 代理模式:给某一个对象提供一个代理&#xff0c;并由代理对象来控制对真实对象的访问。代理模式是一种结构型设计模式。 代理模式角色分为 3种: Subject(抽象主题角色):定义代理类和真实主题的公共对外方法&#xff0c;通常被设计成接口; RealSubject(真实主题角色…

Flutter 安装,配置,运行第一个app 1

起因&#xff0c; 目的: flutter, 其实几年前&#xff0c;我就写过。 当时纯属是个人兴趣&#xff0c;随意探索。 当时我也写了几篇笔记: 比如这一篇还有这个 flutter&#xff0c;其实不难&#xff0c;比较繁琐&#xff0c;小的知识点很多. flutter&#xff0c; 又是环境配…

如何使用 C# 解决 Cloudflare Turnstile CAPTCHA 挑战

处理 CAPTCHA 挑战的复杂性可能是一项艰巨的任务&#xff0c;尤其是在涉及 Cloudflare 的 Turnstile 时。作为一名经验丰富的开发人员&#xff0c;我多年来遇到了许多 CAPTCHA 系统&#xff0c;但 Cloudflare Turnstile 由于其旨在阻止自动化系统的复杂算法&#xff0c;提出了独…

Mac 搭建仓颉语言开发环境(Cangjie SDK)

文章目录 仓颉编程语言通用版本SDK Beta试用报名仓颉语言文档注册 GitCode登录 GitCode 下载 Cangjie SDK配置环境变量VSCode 插件VSCode 创建项目 仓颉编程语言通用版本SDK Beta试用报名 https://wj.qq.com/s2/14870499/c76f/ 仓颉语言文档 https://developer.huawei.com/c…

ad18学习笔记十七:如何正确打开别人给的工程文件

不要单独打开一个pcb文件&#xff0c;如果没有在一个工程中关联上的话&#xff0c;可能会出现无法复制粘贴焊盘的情况。一般别人给文件会给整个工程&#xff0c;要打开的话直接打开整个工程&#xff0c;那么工程里相互关联的几个文件就都可以操作了。 AD中&#xff0c;怎样把从…

Linux操作系统:GCC(GNU Compiler Collection)编译器

在 Linux 系统中&#xff0c;gcc&#xff08;GNU Compiler Collection&#xff09;是一个非常强大的编译器&#xff0c;主要用于编译 C 语言程序。 除了基本的编译和链接命令外&#xff0c;gcc还提供了许多选项和功能。 以下是一些常用的 gcc命令及其功能&#xff1a; 1. 基本…

WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制

知识点&#xff1a; 1、JavaWeb常见安全及代码逻辑&#xff1b; 2、目录遍历&身份验证&逻辑&JWT&#xff1b; 3、访问控制&安全组件&越权&三方组件&#xff1b; 演示案例&#xff1a; JavaWeb-WebGoat8靶场搭建使用 安全问题-目录遍历&身份认…

MATLAB系列09:图形句柄

MATLAB系列09&#xff1a;图形句柄 9. 图形句柄9.1 MATLAB图形系统9.2 对象句柄9.3 对象属性的检测和更改9.3.1 在创建对象时改变对象的属性9.3.2 对象创建后改变对象的属性 9.4 用 set 函数列出可能属性值9.5 自定义数据9.6 对象查找9.7 用鼠标选择对象9.8 位置和单位9.8.1 图…

Linux相关概念和重要知识点(4)(自举、vim)

1.语言和编译器的发展 &#xff08;1&#xff09;汇编语言的出现 计算机只能看懂二进制&#xff0c;但是用二进制实现一个功能就太难了&#xff0c;人们需要发明一种高效的语言。人们抽象出一套编程逻辑&#xff0c;定义了一系列操作&#xff0c;接下来就需要实现它。最初人们…

假期学习笔记总结--iOS 自动释放池

iOS 自动释放池 https://juejin.cn/post/6844904094503567368#heading-23 ARC和MRC 苹果在 iOS 5 中引入了ARC&#xff08;Automatic Reference Counting&#xff09;自动引用计数内存管理技术&#xff0c;通过LLVM编译器和Runtime协作来进行自动管理内存。LLVM编译器会在编…

Linux进阶命令-重定向

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…

我的创作纪念日-20240919

何尝不是一种纪念。 话说&#xff0c;毕业之后和大学同学去深圳&#xff0c;后面回家考编制&#xff0c;现在在家里的中国邮政的代理金融网点上班。

C++:布尔类型,引用,堆区空间

1.布尔类型 #include <iostream>using namespace std;int main() {bool b13;bool b20;cout << "b1" <<b1<< endl;cout << "b2" <<b2<< endl;cout <<boolalpha<< "b1" <<b1<<…

CGE:基于Causal LLM的Code Embedding模型

近日&#xff0c;CodeFuse-CGE 项目在外滩大会展出&#xff0c;吸引了众多技术、产品从业者的到访&#xff0c;部分参观者表示“文搜代码”令人耳目一新&#xff0c;期待模型后续的表现。 以下是 CodeFuse-CGE 项目的相关开源介绍&#xff0c;如果对这部分内容感兴趣&#xff…