SQL-索引篇整理

什么样的列适合建索引?

适合创建索引的列:主键、频繁进行范围检索的列、时常进行多表连接的列、数据量大的表,数据差异大的列。

索引优缺点

索引是数据库中用于提高数据检索性能的排好序的数据结构。它类似于书籍的目录,通过建立特定的数据结构将列或多个列的值与它们在数据表中对应的行关联起来,以加快查询速度。

索引的优点包括:

  1. 提高查询性能:索引可以加快数据库查找数据的速度,通过快速定位到符合查询条件的数据行,减少了数据库进行全表扫描的开销,从而显著提高查询效率。
  2. 唯一性约束:通过在索引上设置唯一性约束,可以确保数据的唯一性,防止重复数据的插入。

然而,索引也有一些缺点:

  1. 占用存储空间:索引通常需要占用一定的磁盘空间。过多的索引可能会增加存储成本。
  2. 索引维护的开销:当对数据表进行插入、更新或删除操作时,索引也需要进行相应的维护操作,这可能导致数据写入的性能下降,更新缓慢。
索引失效的情况

索引失效是指在使用索引进行查询时,索引无法发挥作用,导致查询性能下降。常见的导致索引失效的情况有以下几种:

  1. 不满足索引列顺序:如果查询条件中的列顺序与索引列的顺序不一致,索引可能无法被使用。例如,一个联合索引(A, B),如果查询条件只包含了B列而没有A列,那么这个索引就无法被利用。
  2. 使用函数或表达式:当查询条件中对索引列应用了函数、数学运算、类型转换等操作时,索引可能无法被使用。因为索引的创建是基于原始列值的,无法直接使用函数计算后的结果进行索引匹配。
  3. 字符串比较问题:对于字符串类型的索引列,使用了不符合索引规则的比较方式。
  4. 数据类型不匹配:当查询条件的数据类型与索引列的数据类型不匹配时,索引可能无法被使用。尤其是在进行隐式数据类型转换、不同字符集的比较或编码问题时,需要特别留意。
  5. 数据量过小:当表中的数据量较小时,MySQL可能会选择全表扫描而非使用索引,因为全表扫描的成本较低。这种情况下,索引可能无法发挥作用。
  6. 使用了NOT、<>、OR等非优化的逻辑操作符:这些逻辑操作符在查询条件中的使用会导致索引失效,因为它们无法充分利用索引的特性。
聚簇索引和非聚簇索引

1) 聚簇索引(聚集索引)

聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。

Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

2) 聚簇索引的优缺点

优点:

1.数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快。

2.聚簇索引对于主键的排序查找和范围查找速度非常快。

缺点:

1.插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。

2.更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。

3.二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。

3) 辅助索引(非聚簇索引)

在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。

Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。

辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引。

创建索引的原则

1.适合索引的是出现在where子句的列,或者连接子句中指定的列。
2.基数较小的表,索引效果较差,没有必要在此列建立索引。
3.使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间,如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,然后检查其余行是否可能匹配。
4.不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间越长。所以只需要保持需要的索引有利于条件查询就行了。
5.定义有外键的数据列一定要建立索引。
6.更新频繁字段不适合创建索引。
7.若是不能有效区分数据的列不适合做索引(状态字段)
8.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
9.对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
10.对于定义为text、image和bit的数据类型的列不要建立索引。

创建索引是一个需要根据实际情况不断调整和优化的过程,合理的索引设计可以显著提升数据库的性能。

MySql的索引结构是什么样的,聚簇索引和非聚簇索引区别

二叉树=>AVL树=>红黑树=>B-树=>B+树

二叉树,左<根<右 检索快 AVL树 树中任意节点的子树的高度差最大是1;

红黑树,1.每个节点都是红or黑 2.根节点是黑 3.每个叶子节点都是黑色 4.红色节点的父子节点都必须是黑的 5.从任一个节点到叶子节点的所有路径都包含相同的黑色结点

B-树,1.B-树的每个非叶子节点的子节点个数不超过阶数 2.所有叶子节点都在同一层 3.所有叶子节点关键字按照递增排序

B+树,1.非叶子节点不存数据,只进行数据索引。2.所有数据都放在叶子节点中。 3.每个叶子节点都存在相邻叶子节点的指针。4.叶子节点按照本身关键字从大到小排序。

聚簇索引就是数据和索引是在一起的。
MyISAM使用的是非聚簇索引,树的子节点上的data不是数据本身,而是数据存放的地址。InnoDB采用的是聚簇索引,树的
叶子节点上的data就是数据本身。
聚簇索引的数据物理存放顺序和索引顺序是一致的,所以一个表当中只能有一个聚簇索引,而非聚簇索引可以有多个。
InnoDB中,如果表定义了PK,那PK就是聚簇索引。如果没有PK,就会找第一个非空的unique列作为聚簇索引。否则,
InnoDB会创建一个隐藏的row-id作为聚簇索引。

B+树索引和Hash索引

B树索引(B-Tree) 默认使用的索引结构

优点

  1. 效率:B树索引提供了对数据的快速访问,特别是对于范围查询非常有效。
  2. 自平衡:B树是一种自平衡的树结构,可以保持数据有序,从而使得数据的插入和删除操作都能保持对数时间复杂度。
  3. 聚簇索引:在InnoDB存储引擎中,数据行的存储是按照主键顺序进行的,这使得聚簇索引(Clustered Index)非常高效。
  4. 顺序访问:B树索引支持顺序访问,适合于执行需要按索引顺序进行数据检索的查询。

缺点

  1. 更新成本:对于经常进行数据更新的表,维护B树索引可能需要更多的开销,因为每次更新可能都需要调整树结构。
  2. 空间占用:相比于哈希索引,B树索引可能会占用更多的存储空间。

哈希索引(Hash)

优点

  1. 快速访问:哈希索引在等值查询(如=IN)中非常快,可以达到常数时间复杂度O(1)。
  2. 简单高效:哈希索引结构简单,对于点查询非常高效。

缺点

  1. 不支持范围查询:哈希索引不支持范围扫描,这限制了它在需要范围数据检索的查询中的使用。
  2. 哈希冲突:哈希索引需要解决哈希冲突问题,这可能会影响性能。
  3. 数据无序:哈希索引不保证数据的顺序,因此对于需要索引顺序的查询(如ORDER BY)不适用。
索引类型和性能
  1. 普通索引(INDEX)
    • 这是最基本的索引类型,没有唯一性的限制,允许重复的索引值和NULL值。
  2. 唯一索引(UNIQUE INDEX)
    • 唯一索引要求索引列的值必须唯一,但允许有空值(NULL)。如果是组合索引,则组合的列值必须唯一。
  3. 主键索引(PRIMARY KEY)
    • 主键索引是一种特殊的唯一索引,它不仅要求索引列的值唯一,而且不允许有空值。每个表只能有一个主键索引。
  4. 组合索引(COMPOSITE INDEX)
    • 组合索引,也称为多列索引,是在一个表的多个列上创建的索引。它允许根据多个列的值进行数据检索,提高查询效率。
  5. 全文索引(FULLTEXT INDEX)
    • 主要用于对文本内容进行全文搜索,如对CHAR、VARCHAR或TEXT列进行搜索。
  6. 空间索引(SPATIAL INDEX)
    • 用于地理空间数据类型,以支持地理空间数据存储和查询。
  7. 外键索引(FOREIGN KEY)
    • 用于在两个表之间建立链接,确保引用的数据的完整性和准确性。
  8. 辅助索引(SECONDARY INDEX)
    • InnoDB存储引擎中,除了聚簇索引之外的所有索引都被称为辅助索引。

性能方面,索引可以显著提高查询速度,但也会带来一些性能考虑:

  • 查询性能:索引可以快速定位到数据,减少查询时间,尤其是对于大型数据集。
  • 更新性能:索引可能会降低数据的插入、删除和更新操作的速度,因为每次变动都需要同步索引。
  • 存储空间:索引会占用额外的磁盘空间,尤其是当索引列包含大量数据时。
  • 维护开销:随着数据的变动,索引需要维护,这可能会消耗额外的资源。
覆盖索引和回表

如果只需要在一颗索引树上就可以获取SQL所需要的所有列,就不需要再回表查询,这样查询速度就可以更快。
实现索引覆盖最简单的方式就是将要查询的字段,全部建立到联合索引当中。
user(PK id, name ,sex)
select count(name) from user; -->在name上建立索引
select id,name,sex from user; -->在name上的索引升级成为(name,sex)的联合索引

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

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

相关文章

c语言从入门到函数速成(2)

温馨提醒&#xff1a;本篇文章适合人群&#xff1a;刚学c又感觉那个地方不怎么懂的同学以及以及学了一些因为自身原因停学一段时间后又继续学​​​c的学 好&#xff0c;正片开始&#xff01; 数组 概念&#xff1a;数组中存放的是1个或者多个数据&#xff0c;但是数组元素个…

由于找不到msvcr110.dll,无法继续执行代码的解决方法

在日常使用计算机的过程中&#xff0c;可能会遇到系统提示缺少msvcr110.dll文件的情况&#xff0c;这一问题往往导致某些应用程序无法正常运行。幸运的是&#xff0c;有多种方法可以有效应对这一困境&#xff0c;帮助您的计算机恢复顺畅运作。以下是解决计算机丢失msvcr110.dll…

JavaWeb--1.Servlet

Servlet&#xff08;基础&#xff09; 1、配置依赖&#xff1a; ​ 在pom.xml文件中加入相关依赖 <dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0&l…

python直接发布到网站wordpress之二发布图片

在我的上一篇文章中已经给出了python操作wordpress的环境和发布文字的教程&#xff1a; python直接发布到网站wordpress之一只发布文字-CSDN博客 本篇实现发布带图片的内容&#xff0c;无图无真相嘛。 直接上代码&#xff1a; from wordpress_xmlrpc.methods.media import …

什么是CI/CD流水线

在软件开发中&#xff0c;流水线系统&#xff08;通常被称为CI/CD流水线或部署流水线&#xff09;是一种自动化的过程&#xff0c;用以快速、可靠地将软件从开发阶段引向生产阶段。CI代表持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;而CD代表持续交付&…

Python数据分析案例43——Fama-French回归模型资产定价(三因子/五因子)

案例背景 最近看到要做三因子模型的同学还挺多的&#xff0c;就是所谓的Fama-French回归模型&#xff0c;也就是CAMP资本资产定价模型的升级版&#xff0c;然后后面还升级为了五因子模型。 看起来眼花缭乱&#xff0c;其实抛开金融资产定价的背景&#xff0c;从机器学习角度来…

HTML_CSS学习:常用文本属性

一、文本颜色 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文本颜色</title><style>div{font-size: 90px;}.atguigu1{color: #238c20;}.atguigu2{color: rgb(2…

【b站vue教程】1 宏观视角下的浏览器——前端大厂面试必刷:前后端必学的网络安全浏览器工作原理:从入门到精通全套【附带所有源码】

课程地址&#xff1a;【前端大厂面试必刷&#xff1a;前后端必学的网络安全浏览器工作原理&#xff1a;从入门到精通全套【附带所有源码】】 https://www.bilibili.com/video/BV1UL41157hP/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 1、宏…

vue3中使用crypto-js库进行加密/解密

使用crypto-js库进行加密/解密 安装 npm install crypto-js 基本使用 <template><div>使用crypto-js库进行加密/解密</div> </template><script setup> import CryptoJS from crypto-js; import { onMounted } from vue;// 加密函数 const encr…

常用分辨率

720p: 720 1280 720\times1280 72012801080P: 1920 1080 1920 \times 1080 192010802K: 2048 1152 2048\times1152 204811524K: 4096 2160 4096\times2160 40962160

代码随想录训练营30-动态规划3

一、0/1背包问题 参考博客&#xff0c;主要注意以下几个方面&#xff1a; 1 背包问题要素&#xff1a; 背包容积、物品价值、物品体积 2 dp含义&#xff0c;dp[j]表示为j体积下&#xff0c;最大的物品价值。 3 遍历顺序&#xff0c;如果是二维写法&#xff0c;可以不关心顺…

【C语言】/*printf 函数*/

目录 printf 函数 1.1 语法形式 1.2 基本使用 1.3 占位符 1.4 占位符的输出格式 1.4.1 限定宽度 1.4.2 总是显⽰正负号 1.4.3 限定⼩数位数 1.4.4 输出部分字符串 printf 函数 1.1 语法形式 语法形式&#xff1a;int printf(const char* format, ...); 功能&#xff…

记某APP登录逆向解密过程

最近在学习APP逆向相关的知识&#xff0c;刚好拿到了一个APP目标&#xff0c;该APP登录过程存在加密&#xff0c;所以记录下逆向破解的过程。流程 先介绍下拿到该APP后续所做的一些工作流程 选择相应版本安装到测试机当中进行抓包&#xff0c;查看数据包分析登录请求包&#x…

中国目前比较有影响力的人物颜廷利:不能升命, 活着何用?

不能‘升命’&#xff0c; 活着何用&#xff1f;…&#xff08;升命学说&#xff09; 21世纪东方哲学家思想家、科学家、当代中国教育界知名教授、专业周易起名改名字、易经姓名学专家、目前比较有影响力的人物、现代国学大师泰斗杰出代表颜廷利教授在《升命学说》‘净化论’里…

PCL 点云中的平面点云提取

平面点云提取 一. 索引提取1.1 算法概念1.2 算法流程1.3 主要函数二.代码示例三.结果示例一. 索引提取 1.1 算法概念 平面点云提取:是指从点云数据中提取出属于平面的点的过程。 1.2 算法流程 使用pcl::SACSegmentation类进行点云分割的基本步骤如下: 创建一个pcl::SACSegm…

Java 类与对象

目录 1 类是什么 1.1 面向对象 1.2 面向对象与面向过程 2 类定义和使用 2.1 类的定义格式 2.2 练习定义一个狗类 3 类的实例化 4 this引用 5 对象的构造与初始化 5.1 构造方法与初始化 5.2 默认初始化 5.3 就地初始化 1 类是什么 关于类是什么&#xff0c;我们需要对…

开源版本管理系统的搭建一:SVN服务端安装

作者&#xff1a;私语茶馆 1.Windows搭建SVN版本管理系统 点评&#xff1a;SVN本身非常简洁易用&#xff0c;VisualSVN文档支撑非常好&#xff0c;客户端TortoiseSVN非常专业。5星好评。 1.1.SVN概要和组成 背景介绍 Svn是一个开源版本管理系统&#xff0c;由CollabNet公司…

一、Mysql索引的底层数据结构与算法

Mysql索引的底层数据结构与算法 前言一、索引数据结构为什么 MySQL 的索引要使用 B 树而不是其他树形结构?比如 B 树?为什么InnoDB存储引擎选择使用Btree索引结构&#xff1f; 二、索引分类思考&#xff1a;以下SQL语句&#xff0c;那个执行效率高&#xff1f;为什么&#xf…

SQL如何利用Bitmap思想优化array_contains()函数

目录 0 问题描述 1 位图思想 2 案例实战 3 小结 0 问题描述 在工作中&#xff0c;我们往往使用array_contains()函数来进行存在性问题分析&#xff0c;如判断某个数是否在某个数组中&#xff0c;但是当表数据量过多&#xff0c;存在大量array_contains()函数时&#xff0c;…

【软件测试】测试用例设计方法

1. 等价类划分法1.1. 等价类划分法的定义1.2. 有效等价类和无效等价类1.3. 等价类划分法实例分析 2. 边界值分析法2.1. 边界值分析法的定义2.2. 边界点2.3. 边界值法实例分析 3. 判定表法3.1. 如何用判定表法设计测试用例3.2. 判定表法实例分析 4. 正交表法4.1. 什么是正交表4.…