当前位置: 首页 > news >正文

MySQL中的索引——适合创建索引的情况

1.适合创建索引的情况

1、字段的数值有唯一性的限制

image-20220808223333115

2、频繁作为 WHERE 查询条件的字段

某个字段在 SELECT 语句的 WHERE 条件中经常被使用到,那么就需要给这个字段创建索引了。尤其是在数据量大的情况下,创建普通索引就可以大幅提升数据查询的效率。

比如 student_info 数据表(含 100 万条数据),假设我们想要查询 student_id=123110 的用户信息。

①查看student_info表中的索引

可以看出,我们没有对student_id字段创建索引。

②进行如下查询,耗时220ms

③添加索引

alter table student_info add index idx_sid(student_id);

④再查询。耗时0ms。性能提升很大!

3、经常 GROUP BY 和 ORDER BY 的列

        索引其实就是让数据按照某种顺序进行存储或检索。当我们使用 GROUP BY 对数据进行分组查询,或者使用 ORDER BY 对数据进行排序的时候,如果 对分组或者排序的字段建立索引,本身索引的数据就已经排好序了,进行分组查询和排序操作性能不好吗?另外,如果待排序的列有多个,那么可以在这些列上建立 组合索引

使用GROUP BYORDER BY,先看看不加索引的情况:

没有添加索引,大概执行时间900ms

加上索引

SELECT student_id,COUNT(*) AS num FROM student_info
GROUP BY student_id
LIMIT 100;

执行时间只要40ms,大概相差20多倍!


再考虑复杂一点的情况,group by和order by一起使用

        这是只给student_id和create_time两列单独添加单列索引的情况。可以看到查询速度很慢,要5s多。

ALTER TABLE student_info ADD INDEX idx_sid_cre_time(student_id,create_time DESC);

添加联合索引

使用联合索引只需要耗时0.25ms!

注意:

        如果我们仅仅使用GROUP BY 或者 ORDER BY,且后面只有一个字段,则单独建立索引;如果后面跟多个字段,则建立联合索引。如果既有GROUP BY 又有 ORDER BY,那就建立联合索引,且GROUP BY的字段写在(联合索引的)前面,ORDER BY的字段写在(联合索引的)后面。8.0后的版本也可以考虑使用降序索引。


4、UPDATE、DELETE 的 WHERE 条件列

        对数据按照某个条件进行查询后再进行 UPDATE 或 DELETE 的操作,如果对 WHERE 字段创建了索引,就能大幅提升效率。原理是因为我们需要先根据 WHERE 条件列检索出来这条记录,然后再对它进行更新或删除。 如果进行更新的时候,更新的字段是非索引字段,提升的效率会更明显(不用维护索引了),这是因为非索引字段更新不需要对索引进行维护。

 UPDATE student_info SET student_id = 10002WHERE NAME = '462eed7ac6e791292a79';


5、DISTINCT 字段需要创建索引

        有时候我们需要对某个字段进行去重,使用 DISTINCT,那么对这个字段创建索引,也会提升查询效率。创建索引以后,在B+树种相同的字段就会在一起,这样我们DISTINCT去重的时候,速度就会快很多。

比如,我们想要查询课程表中不同的 student_id 都有哪些,如果我们没有对 student_id 创建索引,执行 SQL 语句:

SELECT DISTINCT(student_id) FROM `student_info`; 

运行结果(600637 条记录,运行时间 0.683s )

如果我们对 student_id 创建索引,再执行 SQL 语句:

SELECT DISTINCT(student_id) FROM `student_info`;

运行结果(600637 条记录,运行时间0.010s )
你能看到 SQL 查询效率有了提升,同时显示出来的 student_id 还是按照 递增的顺序 进行展示的。这是因为索引会对数据按照某种顺序进行排序,所以在去重的时候也会快很多。


6、多表 JOIN 连接操作时,创建索引注意事项

        首先,连接表的数量尽量不要超过 3 张 ,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快(n ,n^2 , n^3…),严重影响查询的效率。

        其次,对 WHERE 条件创建索引,因为 WHERE 才是对数据条件的过滤。如果在数据量非常大的情况下,没有 WHERE 条件过滤是非常可怕的。

        注意:对于用连接的字段创建索引,这些字段在多张表中的 类型必须一致 。比如 course_id 在student_info 表和 course 表中都为 int(11) 类型,而不能一个为 int 另一个为 varchar 类型。否则在查询时,虽然也会帮我们进行隐式的类型转换,转换时会使用函数,但会导致索引失效

可以看到,没有使用索引后,多表连接查询效率高了两百多倍!

http://www.lryc.cn/news/423295.html

相关文章:

  • 5款在线伪原创改写软件,智能改写文章效果好
  • opencv-python图像增强四:多曝光融合(方法一)
  • Qt 实战(9)窗体 | 9.2、QDialog
  • Spring 事务机制
  • Android 13 GMS 内置壁纸
  • 【LeetCode】234. 回文链表
  • 零基础学会机器学习,到底要多久?
  • 视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?
  • Qt解析XML
  • PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解
  • OpenCV—二值化Threshold()、adaptiveThreshold()
  • 第二天:java面向对象编程(OOP)
  • Selenium + Python 自动化测试07(滑块的操作方法)
  • 三防平板满足多样化定制为工业领域打造硬件解决方案
  • pytorch,用lenet5识别cifar10数据集(训练+测试+单张图片识别)
  • Word卡顿的处理方法
  • 在 Linux上常见的10大压缩格式解压命令和它们对应的压缩格式
  • 【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
  • 技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定
  • Linux笔记 --- 标准IO
  • 洛谷:B3625 迷宫寻路
  • 【C#】explicit、implicit与operator
  • Vue:Vuex-Store使用指南
  • 对经典动态规划问题【爬台阶】的一些思考
  • 开发一个能打造虚拟带货直播间的工具!
  • 汽车补光照明实验太阳光模拟器光源
  • MediaPipe人体姿态、手指关键点检测
  • 树上dp之换根dp
  • 2024/8/13 英语每日一段
  • Java多线程练习(1)