MySQL基础:索引

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL中的索引是一种数据结构,能大幅提升数据库查询效率和减少I/O成本,类似于书的目录帮助快速定位内容。其优势包括提高检索效率和降低排序成本,但会占用空间并影响更新表的效率。鉴于查询远多于更新,索引仍被推荐使用。索引分为多种类型,如B+树和哈希索引,其中B+树因其较低的高度和稳定的查询开销成为常用选择。创建和删除索引需谨慎,以免影响性能。

1. 索引概述

MySQL中的索引是帮助MySQL高效获取数据的数据结构,可以极大地提高数据库的查询效率,减少数据库的I/O成本,就像书的目录一样,它可以帮助我们快速定位到书中的内容。

优势:

  1. 提高数据检索的效率,降低数据的IO成本
  2. 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗

劣势:

索引列需要占用一定的空间

索引大大提高了查询效率,同时也降低了更新表的效率,例如对表进行INSERT,UPDATE,DELETE时,效率会降低

在实际开发中,查询操作要远远多于更新操作,还是更推荐使用索引。

2. 索引的分类

3. 索引的使用

3.1. 查看索引

show index from student;

索引是按照列的方式创建的,可以给某个列创建索引

primary key,unique,foreigh key都会自带索引,不需要手动创建,只需要建表的时候指定约束,就会自动生成索引

生成索引之后,假如只有student_id有索引,那么只有select * from student where student_id = 1;这样这对有索引的那一列的查询才会提高效率,其他的话还是遍历整个表

3.2. 创建索引

-- 创建索引
create index name_index on student (name);
-- 查看索引
show index from student;

创建索引其实是一个危险操作:

如果是针对空表或表中的数据量小,创建索引问题不大,但是在日常开发中,正常来说数据规模都是比较大的,一旦创建索引之后,就可能触发大量的硬盘IO,机器就会卡死

所以说,在最初创建表的时候就要提前规划出需要给那些列加上索引,如果说某个表中确实需要加索引,那么就需要重新换一个数据库,把原来的数据导入到新库中

3.3. 删除索引

-- 删除索引
drop index name_index on student;
-- 查看索引
show index from student;

unique自动生成的索引可以被删除,但是primary key 还有 foreigh key自动生成的索引是不可以删除的

既然创建索引就已经是危险操作了,那么删除索引肯定也是一个危险操作,具体原因是一样的,在实际开发中,一般也不会去删除一个索引

4. 索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包括以下几种:

索引结构

描述

B+Tree索引

最常见的索引类型,大部分引擎都支持B+Tree索引

Hash索引

底层是哈希表,只有精确匹配索引列的查询才有效,不支持范围查询

R-tree(空间索引)

空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,使用较少

Full-text(全文索引)

通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,Es

后面两种索引都使用的很少,主要介绍前面两种

在我们学过的数据结构之中,适合作为查询的有哈希表,二叉搜索树,哈希表就不多说了,二叉搜索树可能会变成一个单分支树,或是一条链表,最坏情况下查询的时间复杂度是O(n)的,所以就有了红黑树,边插入边调整,使其保证二叉树的结构,但是当数据量特别大时,尤其是对于数据库这样级别的数据量,红黑树的树高也会非常大,查询的效率还是不够高,所以就又出现了一种为数据库量身打造的数据结构——B+树,B+树是对B树做出了进一步的改进

4.1. B-tree(多路平衡查找树)

B树就是在二叉搜索树的基础上,允许多于两个子节点的多路平衡查找树,有N个key,划分成N+1个区间,通过这样的结构,进行查询的时候,针对每一个节点,都要比较多次,才能确定下一步要走哪个区间,虽然说相比于二叉树,树的高度变低了,但是比较次数变多了,相比于二叉树效率真的提高了吗?

其实,对于每一个节点,访问的时候是一次硬盘IO就可以了,和某个节点比较的的时候,是先一次硬盘IO,把这个节点上的内容都读取出来,接下来的比较都是在内存中进行的了,所以说减少了硬盘IO的次数,因此这种结构效率更高

4.2. B+树

B+树是B树的一种变形形式,

B+树的优势:

  1. N叉搜索树,高度比较低,硬盘IO比较次数就少
  2. 叶子节点是全集,并且用链表结构连接,方便进行范围查询
  3. 在B+树中,所有查询都是要落在叶子节点上完成的,每次查询经历的IO次数和比次数都是差不多的,查询的开销比较稳定
  4. 还是由于叶子节点是全集的性质,非叶子节点不必存储数据行,只需要存储索引列的key即可,这使得非叶子节点占用的空间也比较小

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
2天前
|
存储 SQL 关系型数据库
MySQL高级篇——索引失效的11种情况
索引优化思路、要尽量满足全值匹配、最佳左前缀法则、主键插入顺序尽量自增、计算、函数导致索引失效、类型转换(手动或自动)导致索引失效、范围条件右边的列索引失效、不等于符号导致索引失效、is not null、not like无法使用索引、左模糊查询导致索引失效、“OR”前后存在非索引列,导致索引失效、不同字符集导致索引失败,建议utf8mb4
MySQL高级篇——索引失效的11种情况
|
2天前
|
存储 自然语言处理 关系型数据库
MySQL高级篇——索引的创建与设计原则
索引的分类与使用、MySQL8.0索引新特性、适合创建索引的情况、不适合创建索引的情况
MySQL高级篇——索引的创建与设计原则
|
2天前
|
存储 缓存 关系型数据库
MySQL高级篇——存储引擎和索引
MyISAM:不支持外键和事务,表锁不适合高并发,只缓存索引,内存要求低,查询快MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。5.5之前默认的存储引擎优势是访问的速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用针对数据统计有额外的常数存储。故而 count(*) 的查询效率很高表名.frm 存储表结构;表名.MYD 存储数据 (MYData);
MySQL高级篇——存储引擎和索引
|
2天前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
26天前
|
缓存 关系型数据库 MySQL
在Linux中,如何优化MySQL性能,包括索引优化和查询分析?
在Linux中,如何优化MySQL性能,包括索引优化和查询分析?
|
27天前
|
SQL 关系型数据库 MySQL
MySQL索引你用对了吗?
本文从遇到的问题出发,分析了tddl优化器、MySQL索引、分表拆分键的选择相关知识。
|
28天前
|
存储 关系型数据库 MySQL
MySQL bit类型增加索引后查询结果不正确案例浅析
【8月更文挑战第17天】在MySQL中,`BIT`类型字段在添加索引后可能出现查询结果异常。表现为查询结果与预期不符,如返回错误记录或遗漏部分数据。原因包括索引使用不当、数据存储及比较问题,以及索引创建时未充分考虑`BIT`特性。解决方法涉及正确运用索引、理解`BIT`的存储和比较机制,以及合理创建索引以覆盖各种查询条件。通过`EXPLAIN`分析执行计划可帮助诊断和优化查询。
|
1月前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
95 4
|
1月前
|
SQL JavaScript 关系型数据库
Mysql索引不当引发死锁问题
本文通过真实案例解析了MySQL在高并发环境下出现死锁的问题。数据库表`t_award`包含多个索引,但在执行特定SQL语句时遭遇索引失效,导致更新操作变慢并引发死锁。分析发现,联合索引`(pool_id, identifier, status, is_redeemed)`因`identifier`允许为空值而导致索引部分失效。此外,`pool_id`上的普通索引产生的间隙锁在高并发下加剧了死锁风险。为解决此问题,文中提出了调整索引顺序至`(pool_id, status, is_redeemed, identifier)`等方案来优化索引使用,进而减轻死锁现象。

热门文章

最新文章