MySQL的索引概述

2023-09-18 16:32:33

目录

一、索引的描述

二、 如何在一个数据表中创建和删除索引呢?

三、索引的"两面性"

四、索引的适用场景


一、索引的描述

         索引是数据库中一种用于提高数据检索速度和加快查询操作的数据结构。它类似于书籍的目录,可以快速定位到包含特定关键字或值的记录。索引的主要作用是加速数据库的数据检索过程,特别是在大型数据集和复杂查询的情况下。

二、 如何在一个数据表中创建和删除索引呢?

        可以通过两个命令来实现:ALTER和CREAT,ALTER语句适用于已存在的表上的索引添加、修改和删除操作,而CREAT语句适用于创建新的表或在已存在的表上创建索引。

-- index_name 是所创建的索引的名称
-- table_name 是要在其上创建索引的表名称
-- column_name 是要在该表上创建索引的列名

ALTER TABLE table_name ADD INDEX index_name (column_name);
-- INDEX 关键字用于指定要创建的索引的类型。
CREATE INDEX index_name ON table_name (column_name);

常用的索引类型有:

-- 1.创建 B-树索引(B-Tree Index):B-树是一种广泛使用的索引结构,
-- 适用于范围查询和精确匹配,常用于大部分的数据库系统。
CREATE INDEX index_name ON table_name (column_name);

-- 2.创建唯一索引(Unique Index):唯一索引要求索引列的值必须是唯一的,
-- 用于保证表中的某一列的数值在表中是唯一的。
CREATE UNIQUE INDEX index_name ON table_name (column_name);

-- 3.创建主键索引(Primary Key Index):主键索引是一种特殊的唯一索引,
-- 它用于标识一张表中的唯一记录,并且不能为空。
ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (column_name);

-- 4.创建聚集索引(需要根据具体的数据库系统而定):聚集索引决定了数据在磁盘上的物理存储
-- 顺序,一个表只能有一个聚集索引。在聚集索引的情况下,数据按照索引的顺序存储,所以聚集
-- 索引所在的列值的范围和顺序决定了表中数据存储的物理顺序。
CREATE CLUSTERED INDEX index_name ON table_name (column_name);

-- 5.创建非聚集索引(需要根据具体的数据库系统而定):非聚集索引是在数据行旁边单独存储的
-- 一种数据结构,非聚集索引本身并不决定表中数据行的物理存储顺序。
CREATE NONCLUSTERED INDEX index_name ON table_name (column_name);

-- 6.创建全文索引(需要根据具体的数据库系统而定):全文索引用于对全文内容进行搜索,
-- 如文章、文档或大型文本字段等。
CREATE FULLTEXT INDEX index_name ON table_name (column_name);

-- 7.创建空间索引(需要根据具体的数据库系统而定):空间索引用于优化对包含空间数据
-- (如地理数据)的列进行空间查询的性能。
CREATE SPATIAL INDEX index_name ON table_name (column_name);

-- 8.创建多列索引(Composite Index):多列索引是指在多个列上创建的索引,
-- 用于优化涉及多个列的查询。
CREATE INDEX index_name ON table_name (column1, column2, column3);

三、索引的"两面性"

使用索引有什么好处呢?又会产生什么问题呢?

优点:

  1. 提高查询性能:索引可以加速数据库查询的速度。通过在索引列上建立索引,数据库可以更快地定位到存储在表中的特定数据。索引使得数据库可以跳过不需要检查的数据,只关注满足查询条件的数据,从而提高查询效率。

  2. 减少数据读取操作:索引可以减少磁盘 I/O 操作的次数。通过使用索引,数据库可以更快地将数据加载到内存中,减少读取磁盘的频率,从而提高整体查询性能。

  3. 加速排序和连接操作:索引可以加速排序和连接操作的速度。对于需要按特定顺序排序的查询或需要连接多个表的查询,索引可以有效地减少数据库执行这些操作所需的时间。

  4. 提高数据完整性:通过在列上创建唯一索引或主键索引,可以确保表中的数据在指定的列上是唯一的或不能为空,从而维护表的数据完整性。

  5. 优化全文搜索:通过创建全文索引,可以提高全文搜索操作的性能。全文索引能够快速定位包含指定关键字的文本,加速搜索过程。

缺点:

  1. 增加存储空间:索引需要占用额外的存储空间来存储索引数据结构。当表的数据量很大时,索引的大小可能相当可观,增加了存储的开销。

  2. 增加写操作的时间:在插入、更新和删除数据时,索引也需要进行维护以保持数据的一致性。这意味着在执行这些写操作时,数据库不仅要更新实际的数据,还要更新相应的索引结构。当表包含多个索引时,写操作的开销可能会显著增加。

  3. 维护成本:创建和维护索引需要一定的成本。当表的数据发生变化时,需要相应地更新索引,以保持索引的有效性和性能。这包括插入、更新和删除数据时的索引维护操作。

  4. 索引选择的复杂性:确保选择合适的索引列是一项重要的任务。不正确的索引设计可能会导致索引无效,甚至影响数据库性能。需要仔细评估查询模式和数据访问模式,以选择最适合的索引列。

  5. 可能导致查询性能下降:虽然索引可以提高查询性能,但在某些情况下,索引可能会导致查询性能下降。当查询涉及到多个表连接、范围查询或使用与索引不匹配的查询条件时,数据库可能无法充分利用索引的优势,甚至需要额外的索引扫描操作,从而导致性能下降。

四、索引的适用场景

        索引在数据库中可以提高查询性能和数据完整性,但在某些情况下,使用索引可能不是最佳选择。以下是一些情况下适合使用索引的情况,以及一些情况下应该避免使用索引的情况:

适合使用索引的情况:

  1. 经常被查询的列:如果某个列经常被用作查询条件,并且数据量庞大,那么在该列上创建索引可以提高查询性能。

  2. 多表连接操作:当需要进行多个表之间的连接操作时,使用索引可以加速连接的速度,提高查询性能。

  3. 范围查询:对于包含范围查询的操作,如 BETWEEN、大于小于号等,通过在相关列上创建索引,可以加快执行这些范围查询的速度。

  4. 排序和分组:当需要对结果进行排序或分组时,使用索引可以改进排序和分组操作的性能。

  5. 唯一性约束:为了保持数据的完整性,对于需要保证唯一性的列,可以创建唯一索引或主键索引。

避免使用索引的情况:

  1. 数据量较小的表:对于包含较少数据的表,使用索引可能不会带来明显的性能提升。因为索引的维护成本和额外的存储空间可能会带来不必要的开销。

  2. 频繁的写操作:当表需要频繁地插入、更新或删除数据时,索引的维护成本可能会导致写操作的性能下降。在这种情况下,需要权衡读写操作的需求,决定是否创建索引。

  3. 少数取值的列:对于某些列的取值少且分布均匀的情况,如性别列等,使用索引可能无法带来明显的性能改进。

  4. 不经常使用的列:如果某个列很少被用于查询条件,或者很少被用于排序和分组操作,创建索引可能对性能没有实质性影响,且增加了额外的存储和维护开销。

更多推荐

vue-cli vue3

安装clinpmi-g@vue/cli@4.5.13查看版本:vue-V升级版本:npmupdate-g@vue/cli升级在v3.0.0版本中是不支持的最新的scriptsetup语法执行指令升级:npmivue@3.2.8vue-router@4.0.11vuex@4.0.2"vue":"^3.2.8","vue-

路由器端口转发

什么是路由器端口转发路由器端口转发是一种网络配置技术,用于将公共网络(如互联网)上的请求转发到私有网络中的特定设备或服务。它允许外部设备通过路由器访问内部网络中的设备或服务,实现网络上的通信和互动。路由器端口转发的作用路由器端口转发的作用是允许公共网络中的设备或用户通过路由器访问私有网络中的特定设备或服务。它可以实现以

LeetCode 1337. The K Weakest Rows in a Matrix【数组,二分,堆,快速选择,排序】1224

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及

STM32F4X UCOSIII 事件集

STM32F4XUCOSIII事件集事件的应用场景UCOSIII事件工作机制UCOSIII事件操作函数事件创建函数事件删除函数事件发送函数事件接收函数UCOSIII事件例程事件在RTOS中也是一种任务间同步的机制,事件不能传递数据。跟信号量不同的是,事件可以实现一对多,多对多的同步,也就是一个事件可以唤醒多个任务,一个

2022/9/13总结

Vue路由的封装抽离为了便于维护,我们通常需要将路由模块抽离出来在vue中,如果要写路径,可以写绝对路径使用@@代表从src目录下去寻找,能避免出现很多错误声明式导航--导航链接vue-router提供了一个全局组件router-link(取代a标签)配置to属指定路径本质是a标签,to无需#优点:能高亮默认会提供高亮

人工智能AI 全栈体系(五)

第一章神经网络是如何实现的为什么使用ReLu函数?五、梯度消失问题1.什么是梯度消失问题?前面我们介绍的BP算法中,是这样更新权重值的:δ∗h=oh(1−oh)∑∗k∈后续(h)δ∗kw∗kh\delta*h=o_h(1-o_h)\sum*{k\in后续(h)}\delta*kw*{kh}δ∗h=oh​(1−oh​)∑

百度SEO优化不稳定的原因分析(提升网站排名的稳定性)

百度SEO优化不稳定介绍蘑菇号-www.mooogu.cnSEO不稳定是指网站在搜索引擎中的排名不稳定,随着时间的推移会发生变化。这种情况可能会出现在网站页面结构、内容质量、外链质量等方面存在缺陷或不合理之处。因此,优化SEO非常重要,可以提高网站的稳定性和排名。掌上帮教-www.zsbjiao.cn百度SEO不稳定因

Unity制作射击游戏案例01

整理逻辑思路://【业务逻辑】这个脚本用来1.控制物体移动旋转(WASD)、2.发射子弹(空格键)//【程序逻辑2】首先检测用户没有按下空格键2.如果按下呢执行发射子弹函数3.克隆子弹4.让克隆的子弹往前跑搭建场景为子弹模板添加刚体,并且限制旋转编写脚本:usingSystem.Collections;usingSys

MySQL 高级语句 Part1(进阶查询语句+MySQL数据库函数+连接查询)

高级语句第一部分一、MySQL进阶查询语句1.1select----显示表格中一个或数个字段的所有数据记录1.2distinct----不显示重复的数据记录1.3where----有条件查询1.4andor----且或1.5in----显示已知的值的数据记录1.6between----显示两个值范围内的数据记录1.7通

网络安全(黑客)自学

前言:作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。谈起黑客,可能各位都会想到:盗号,其实不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一般分为三大圈:娱乐圈技术圈职业圈。娱乐圈:主要是初中生和高中生较多,玩网恋,人气,空间,建站收徒玩赚钱,技术高的也是有的,只是很少见。技术圈:这个圈

英伟达 nvidia 官方code llama在线使用

新一代编程语言模型CodeLlama面世:重新定义编程的未来随着人工智能和机器学习技术的迅速发展,我们现在迎来了一款革命性的大型编程语言模型——CodeLlama。该模型是基于Llama2研发的,为开放模型中的佼佼者,其性能达到了行业领先水平。模型特点与亮点CodeLlama系列提供多种型号,以满足不同应用的需求。包括

热文推荐