MySQL之索引

news2024/11/19 13:34:06

引言

数据库作为项目中必不可少且运行速度相对较慢的一环,尤其是在大数据量下保证其更高的性能、更稳定的性能是每个后端程序员必备的技能。MySQL在执行查询语句时,会通过IO扫描磁盘,遍历数据表中的每一条数据,时间复杂度为O(N),当数据量达到百万级别时,查询的速度会极慢,严重影响用户体验。

索引概述

索引是一种数据结构,是对记录集的一个或多个字段的值进行排序的存储结构。

A database index is a data structure that improves the speed of operations in a table. Indexes can be created using one or more columns, providing the basis for both rapid random lookups and efficient ordering of access to records.

数据库索引是一种提高表操作速度的数据结构。 可以使用一列或多列创建索引,为快速随机查找和有效排序记录访问提供基础。

如何创建索引

  • 创建数据表时添加索引

    CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);
    
  • 以修改数据表的形式添加索引

    ALTER TABLE testalter_tbl ADD INDEX (c);
    

索引对查询的影响

未加索引时查询某表:

explain
select * from employee where name = '陈静';

image-20221122213941079

使用DDL语句给数据表Name字段增加索引:

alter table employee add index name_index (name);

再次执行查询语句,使用explain查看结果

image-20221122214215453

MySQL在命中索引后,查询时不再扫描全表,而是通过索引找到对应数据。

索引是如何工作的

索引的出现其实是为了提高数据查询的效率,就像书的目录一样,根据目录可以快速定位到内容,类比于索引,根据索引提供指向存储在表的指定列中的数据值的指针,根据指针找到包含该值的行。

举一个形象点的例子:将一张数据表比喻成一个字典,数据表的每一条数据都相当于字典中的每一个字,当我们需要查询某个字时,需要从字典的第一页开始翻,直到找到我们要查找的目标字,机器擅长重复性劳动,不会觉得“累”,但是字典里的字实在是太多了,即使机器不怕“累”,但时效终究是我们追求的东西,因此,我们需要一个方法快速找到目标字,我们根据字的拼音首字母分类,将相同字母的字放在一起,即某个字母看做一个节点,该节点下都是同类的汉字,这样在查询时便缩小了查询范围,所有的分类放在一起就是目录,它记录了目标字(数据)所在的具体页数(行数)。

索引为什么选择B+树

常见的索引数据结构分为以下几种:

  • 哈希表
  • 有序数组
  • B+树
哈希表

哈希表将待查询的值放入key中,value值放入数组中,在查询时通过计算Key的哈希值找到对应的值,因此哈希表适用于等值查询的场景(如:where id =1;),但哈希表并不是有序的,因此在区间查询(如where id between 1 and 5),在区间查询时,效率比较低。

有序数组

有序数组在等值查询和范围查询场景中的性能都非常优秀。

仅看查询效率,有序数组是最好的数据结构,使用二分法查询可以快速查询到目标值,时间复杂度是O(log(N))。但是在中间插入一个记录时就必须得挪动后面所有的记录,成本太高。

二叉树

二叉树的特点是:父节点左子树所有节点的值小于父节点的值,右子树所有节点的值大于父节点的值。查询复杂度是O(log(N))

img

二叉树是搜索效率最高的,但是实际上没有多少数据库存储使用,因为索引不止存在于内存中,还要写在磁盘上。数据量较大时,二叉树的树过高,查询时需要访问过多节点,即需要硬盘多次寻址,这是一个耗时操作。

N叉树
概念:允许树的每个节点可以有两个以上的子节点,那么这个树就称为N阶多叉树。

MySQL默认一个节点的长度为16K,一个整数(bigint)字段索引的长度为8B,另外每个索引还跟着6B的指向其子树的指针;所以16K/14B≈1170。

树高是4的时候,就可以存1200的3次方个值(17亿),树根的数据总是存在内存中的,一个10亿行的表上一个整数字段的索引,查找一个值最多只需要访问3次磁盘。树的第二层也大概率在内存中,那么访问磁盘的次数就少了。

N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中。

常见问题

生产数据库添加索引

在开发中我们会遇到给生产数据库的表增加索引的情况,该行为属于是DDL操作,在执行时数据表会进行锁表,即表在锁定期间不可对表进行操作,必须等锁被释放才可以进行操作,给表增加索引会会触发为现有数据重建索引,可能会导致数据库长时间阻塞,事务不能被提交,最终会拖垮数据库,因此在给线上数据表增加索引时,可以使用如下操作:

按新结构创建新表 -> 将旧表数据迁移至新表 -> 重命名两个表(三步都通过编写sql语句完成,比手动操作快,第二步的数据迁移操作视情况而定)。

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

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

相关文章

【机器学习】EM算法

EM算法 目录一、似然函数与极大似然估计二、Jenson不等式三、数学期望的相关定理四、边缘分布列五、EM算法一、似然函数与极大似然估计 例一 现有一个不透明的罐子,里面装有质地、大小均相同而颜色不同的黑白两种球(数目未知)。现要求在经过…

MyBatis 增删改查操作

什么是 MyBatis? mybatis 是一款优秀的持久层框架,用于简化 JDBC 开发 MyBatis 本是 Apach 的一个开源项目 iBatis,2021 年这个项目由 apach software foundation 迁移到了 google code,并且改名为 MyBatis。2013 年 11 月迁移到…

[附源码]java毕业设计氧气罐管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

js逆向之反调试之无限debugger解决

js逆向之反调试之无限debugger解决 文章目录 js逆向之反调试之无限debugger解决方案一方案二方案三方案一 右击debugger行数位置,点击add conditional breakpoint… 点击add conditional breakpoint.png 添加false,然后按回撤, 刷新网页,发现成功跳过无限debugger 修改成…

TiDB 6.0 新特性

TiDB 6.0 新特性 Placement Rules in SQL小表缓存内存悲观锁Top SQLTiDB Enterprise Manager(TiEM) Placement Rules in SQL Placement Rules in SQL 之前: 跨地域部署的集群,无法本地访问无法根据业务隔离资源,leader全在一个TiKV节点上…

CTFHub | UA注入

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习,实训平台。提供优质的赛事及学习服务,拥有完善的题目环境及配套 writeup ,降低 CTF 学习入门门槛,快速帮助选手成长,跟随主流比赛潮流。 0x01 题目描述…

新发现,新挑战,技术出海的机遇与挑战丨PingCAP DevCon 2022 出海专场

现在报名活动,有机会获得限定好礼哦!👆 中国企业出海的格局和挑战正在发生重大改变。回到技术管理者熟悉的技术世界,过去两年的技术环境也发生了巨大的变化,开源软件与云服务的结合成为业界共识的潮流,在多…

linux篇【11】:linux下的线程<后序>

目录 一.线程互斥 1.三个概念 2.互斥 (1)在执行语句的任何地方,线程可能被切换走 (3)抢票场景中的问题 (4)解决方案 3.加锁 (1)加锁介绍 (2&#xf…

C语言百日千题系列之《忘情水题》第一日

目录 绪论 1.最大数位置 2.与指定数字相同的数的个数 3.蓝桥杯2013年第四届真题-核桃的数量 4.求所给范围内水仙花数并排列 5.最大值和最小值的差 6.计算书费 7.角谷猜想 8. 最高的分数 9.年龄与疾病 10.-百钱百鸡问题 绪论 本文是C语言百日千题系列《忘情水题》的第…

BCN衍生物:endo-BCN-PEG4-TAMRA,endo-BCN-PEG4-Palmitic,endo-BCN-PEG4-DSPE的特点分享

凯新生物公司小编分享:endo-BCN-PEG4-TAMRA ,endo-BCN-PEG4-Palmitic,endo-BCN-PEG4-DSPE这几种的物理相关数据。 1、endo-BCN-PEG4-TAMRA 四甲基罗丹明(TAMRA)-叠氮化物是一种化学探针,用于直接在活细胞中…

代码随想录算法训练营第八天|二叉树(截止到左叶子之和)

翻转二叉树 Leecode 226.翻转二叉树 链接:https://leetcode.cn/problems/invert-binary-tree/ 用递归来做,若是遇到空节点,直接return 然后交换左右节点,接着递归 class Solution { public:TreeNode* invertTree(TreeNode* r…

Java代码审计——SSH 框架审计技巧

目录 (一) SSH 框架简介 (二) Java SSH 框架审计技巧 (一) SSH 框架简介 上个月介绍了 SSM 框架,即 Spring MVC、Spring 和 MyBatis。接下来介绍 Java Web曾经开发的 SSH 框架,即 …

河北涿州水稻种植历史 国稻种芯·中国水稻节:保定效益双赢

河北涿州水稻种植历史 国稻种芯中国水稻节:保定效益双赢 央视网消息 保定日报讯(通讯员张千 刘永兴 王蕾)新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农…

浅谈前缀索引

一.什么是前缀索引 所谓前缀索引说白了就是对字符串或前n个字符建立索引 二.为什么选择前缀索引 一般来说使用前缀索引,可能都是因为整个字段的数据量太大,没有必要针对整个字段建立索引,前缀索引仅仅是选择一个字段的前n个字符作为索引&a…

Linux运维工程师的操作规范

,Linux运维工程师的操作规范从事运维有一段时间了,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题。 今天简单整理一下,分享给各位小伙伴。 一、线上操作规范 1、…

你可见过如此细致的延时任务详解

概述 延时任务相信大家都不陌生,在现实的业务中应用场景可以说是比比皆是。例如订单下单 15 分钟未支付直接取消,外卖超时自动赔付等等。这些情况下,我们该怎么设计我们的服务的实现呢? 笨一点的方法自然是定时任务去数据库进行轮…

华为机试 - 滑动窗口最大和

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止, 每次窗口滑动产生一个窗口和(窗口内所有数的和&…

常用的框架技术-09 Spring Security Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1.Spring Security简介1.1 Spring Security概述1.2 Spring Security历史发展1.3 产品的对比1.3.1 Spring Security1.3.2 Shiro1.4 Spring Security 核心类1.4.1 Auth…

qemu 线程 vhost

[rootlocalhost cloud_images]# lsmod | grep vhost_net vhost_net 262144 0 vhost 262144 1 vhost_net tap 262144 1 vhost_net tun 262144 2 vhost_net [rootlocalhost cloud_images]#vhost-net网卡的…

[附源码]SSM计算机毕业设计基于实时定位的超市配送业务管理JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…