MySQL学习6:索引

2023-09-14 15:30:22

来源

教学视频来源:黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括

简介

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特点查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高价查找算法,这种数据结构就是索引。

使用索引可以提高查询速度,比如查找年龄是45的用户

在这里插入图片描述
注: 上述二叉树索引结构只是一个示意图,并不是真正的索引结构

优点:

  • 提高查询性能:索引可以大大减少查询数据的扫描量,从而提高查询效率。通过使用索引,数据库可以更快地定位和检索所需的数据。

  • 加速排序操作:如果查询中包含排序操作,索引可以加快排序的速度。通过使用索引,数据库可以快速定位并返回排序结果。

  • 提高数据唯一性:可以在索引中定义唯一性约束,确保表中的数据不重复。

  • 支持快速聚合操作:对于包含聚合函数的查询,索引可以提供更快的结果计算和返回。

缺点:

  • 占用存储空间:索引需要占用额外的存储空间。随着索引的增加,数据库的存储需求也会增加。

  • 增加写操作的开销:当对表进行插入、更新和删除操作时,索引也需要进行相应的更新。因此,索引会增加写操作的开销,对性能产生一定的影响。

  • 维护索引需要时间:当表中的数据发生变化时,索引也需要相应地进行维护。这会导致写操作的延迟增加。

  • 不适用于所有情况:对于某些小型表或者数据分布不均匀的表,使用索引可能不会带来明显的性能提升,甚至可能降低查询性能。

索引结构

MySQL中的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含一下几种:
在这里插入图片描述

InnoDB存储引擎使用的是B+tree索引结构。原因是:

  • 相对于二叉树,层级更少,搜索效率更高
  • 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低。
  • 相对于Hash索引,B+tree支持范围匹配及排序操作

索引分类

在这里插入图片描述
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
在这里插入图片描述
聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引
  • 如果不存在主键,将使用第一个唯一索引作为聚集索引
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

索引语法

创建索引

create [unique | fulltext] index index_name  on table_name(index_col_name,...)

查看索引

show index from table_name

删除索引

drop index index_name on table_name

通常主键为主键索引,如果使用主键来查询数据会比使用其他字段查询的速度会更快。如果需要使用其他字段来进行查询时,当数据量过大时,可以通过创建索引来提示查询效率。

注: 当数据量过大时,构建索引也会花费一些时间

索引使用

查看使用了哪些索引

我们在执行查询语句时,可以在查询语句前面加上explain关键字,来查看该查询语句使用了哪些索引

在这里插入图片描述

使用原则

最左前缀法则

如果索引了多列(联合索引,由多个列组成的索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。

如果查询条件没有按照索引的最左前缀顺序提供,MySQL将无法充分利用索引,可能会导致全表扫描或部分索引扫描,从而影响查询性能。

如果跳过某一列,索引将部分失效(后面的字段索引失效)

例如,如果您创建了一个复合索引 (col1, col2, col3):

  • 只使用col1列,索引生效
  • 使用col1,col2 索引生效
  • 全部都使用(字段的顺序不一定是col123,也可以是col321),索引生效
  • 使用col1、3,只有col1的索引生效

范围查询
联合索引中,出现范围查询(大于、小于),范围查询右侧列的索引失效。大于等于这种的会生效
例如下面这条sql,后面的 and sex = '男' 是不会生效

select * from student where profession = '软件工程' and age > 23 and sex = '男'

索引列运算
不要在索引列上进行运算操作,索引将失效。

字符串
字符串类型字段使用时,不加引号,索引将失效。这里指的是字符串类型的数字

模糊查询
如果是头部模糊匹配,索引失效,比如:

explain select * from student where name like '%四'

or连接的条件
or分割的条件,如果or前的条件中有列索引,而后面的列中没有索引,那么涉及的索引都不会被用到

数据分布影响
在执行查询时,MySQL会进行评估,如果使用索引比全表扫描更慢,则不适用索引

前缀索引

当字段类型为字符串时,有时候需要索引很长的字符串,这会让索引变得很大,查询时浪费大量的磁盘IO,影响查询效率。
此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

语法

// index_name:索引名称    table_name:表名    column:列    n:指定几个字符
create index index_name on table_name(column(n))

前缀长度
可以根据索引的选择性来决定,而选择性是指不重复的索引值和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。

计算方式示例

select count(distinct name) / count(*) from student;

在这里插入图片描述
判断应该截取几个字符

select count(distinct substring(name,1,10)) / count(*) from student;

通过修改截取的字符串长度来计算几个字符比较合适后就可以创建前缀索引了,比如:create index index_name_3 on student(name(3))

单例索引与联合索引的选择问题

  • 单列索引:一个索引只包含单个列
  • 联合索引:一个索引包含了多个列

在业务场景中,如果存在多个查询条件,考虑针对查询字段建立索引时,建议建立联合索引,而非单例索引。

索引设计原则

  • 针对数据量较大(几十万数据),且查询比较频繁的表建立索引
  • 针对于常作为查询条件、拍下、分组操作的字段建立索引
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
  • 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立索引
  • 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率
  • 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改查的效率
  • 如果索引列不能存储null值,请在创建表时使用not null约束它。当优化器知道每列是否包含null值时,它可以更好的确定哪个索引更有效的用于查询。
更多推荐

8位单片机的优势:永不过时的选择

被广泛应用于各种智能化设备中,8位单片机以其独特的优势,成为了许多应用场景的首选。为什么它们在今天仍然具有重要的应用价值?一、8位单片机的优势:(1)成本效益8位单片机由于其制造成本相对较低,因此价格相对较为亲民。这意味着使用8位单片机可以降低整个产品的成本,提高市场竞争力。(2)可靠性高8位单片机经过多年的发展和优化

c++:三种实例化对象方式

1.隐式创建首先我们定义一个测试类classPerson{private:intage;stringname;public:Person(){cout<<"thisisconstruct~";}Person(intage,stringname){this->age=age;this->name=name;cout<<"

Django之初入门

一)Django简介1.简介Django是一个开源的PythonWeb框架,它以简洁高效的方式帮助开发者构建复杂的Web应用程序。Django采用了MVC(Model-View-Controller)的架构模式,通过强大的工具和功能,提供了一套完整的解决方案,使开发过程更加简单、快速和可扩展。Django拥有丰富的内置

安科瑞电流隔离传感器 BA穿孔交流电流变送器-安科瑞黄安南

一.产品原理和功能介绍BA系列产品应用电磁感应原理,对电网中的交流电流进行实时测量,采用精密恒流技术和线性温度补偿技术,将其隔离变换为标准的直流信号输出采用24伏或12伏安全电压供电,具有过载能力强、高精度、高隔离、高安全性、低功耗等特点,可广泛用于工业自动化领域。可以选配真有效值,也可以对漏电流进行实时测量.BA系列

Spring IOC 容器:掌握 Spring 的核心技术

Spring是一个非常流行和强大的Java开发框架,它可以帮助我们简化和优化Java项目的开发过程。Spring的核心技术之一就是IOC(InversionofControl,控制反转),它可以实现对象之间的解耦,让对象的创建和管理由Spring容器来完成,而不是由对象自己或使用对象的类来完成。这样可以提高代码的可维护

mysql限制用户登录失败次数,限制时间

mysql用户登录限制设置mysql需要进行用户登录次数限制,当使用密码登录超过3次认证链接失败之后,登录锁住一段时间,禁止登录这里使用的mysql:8.1.0这种方式不用重启数据库.配置:首先进入到mysql命令行:然后需要安装两个插件:在mysql命令行中执行:mysql>INSTALLPLUGINCONNECTI

SpringMvc根据返回值类型不同处理响应

目录一、介绍二、返回值为void(1)控制层方法三、返回值为String(1)控制层四、返回值为ModelAndView(1)控制层方法(2)jsp页面一、介绍我们可以通过控制器方法的返回值设置跳转的视图。控制器支持如void,String,ModelAndView类型。二、返回值为void返回值是void会跳转到名字

“深入理解SpringMVC的JSON数据返回和异常处理机制“

目录引言1.SpringMVC之JSON数据返回1.1导入依赖1.2配置弹簧-MVC.xml1.3@ResponseBody注解使用1.4.Jackson2.异常处理机制2.1为什么要全局异常处理2.2异常处理思路2.3SpringMVC异常分类2.4综合案例总结引言在现代Web开发中,SpringMVC是一个广泛使用

【SpringMVC】自定义注解

🎉🎉欢迎来到我的CSDN主页!🎉🎉🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚🌟在这里,我要推荐给大家我的专栏《SpringMVC》。🎯🎯🚀无论你是编程小白,还是有一定基础的程序员,这个专栏都能满足你的需求。我会用最简单易懂的语言,带你走进SpringMVC的世界,让你从零开始,一步步

设计模式:组合模式

目录组件代码实现优缺点源码中应用总结组合模式是一种结构型设计模式,用于将对象组织成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,而不需要区分它们之间的差异。在组合模式中,有两种主要类型的对象:叶节点和组合节点。叶节点表示树结构中的最小单位,它们没有子节点。而组合节点则可以

求生之路2服务器搭建插件安装及详细的游戏参数配置教程linux

求生之路2服务器搭建插件安装及详细的游戏参数配置教程linux大家好我是艾西,在上一篇文章中我用windows系统给搭建演示了一遍怎么搭建自己的L4D2游戏。那么也有不少小伙伴想知道linux系统的搭建方式以及在这个过程中有什么区别。那么艾西今天就跟大家分享下用linux服务器系统搭建求生之路2(注:因PT原因本文中w

热文推荐