MySQL索引优化二

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL索引优化二

前言

这篇文章继续讨论索引优化,如果没有看过上篇文章MySQL索引优化一一定看了再看这篇。

你别问我:阿紫,那你怎么不写到一篇文章里呀?

好吧,其实没有什么特别的理由,单纯是累了,想休息休息接着写。

好了继续继续。

这篇文章的主要内容:讨论一下OrderBy、Join、In、Exist相关的原理。

OrderBy

order by是怎么使用索引的?

order by同样遵循最左前缀法则,只有当order by的字段是最左字段或者跟随where条件的字段时,才能使用索引排序

排序排序,关键就在于:有序

如以下联合索引:name_age_position

image-20230120150557493

name字段是天然有序的,name值相同时,age是有序的,age相同时,position是有序的。

那应该怎么判断sql使用了索引排序呢?

如以下sql

explain select id from employees order by name;

image-20230120221351505

Extra列:

Using index:使用覆盖索引

Using filesort:将用文件排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。

只要没有Extra列出现use filesort,那么就是用的索引排序

再看看使用文件排序的sql

explain select id from employees order by age;

image-20230120221742350

注意,使用了索引是使用了索引,文件排序是文件排序,这是两码事。

比如你使用了索引进行查找数据,但是查找出的数据是用的文件排序。

接下来看看一些案例

sql1

explain select * from employees where name = 'zhangsan18' order by age,position;

索引排序,age跟在name字段后,position跟在age字段后

image-20230121214814792

sql2

explain select * from employees where name = 'zhangsan18' order by position,age;

文件排序,因为该sql是先使用position字段排序,再使用age字段排序,而position字段在name相同时依旧是无序的。

image-20230121215028356

sql3

explain select * from employees where name = 'zhangsan18' and age = 18 order by position,age;

索引排序,position跟在age后,是有序的,而orderby后的age其实会被优化成常量,因为是通过age=10查询出的数据

image-20230121215301638

sql4

explain select * from employees where name = 'zhangsan18' order by age asc,position desc;

文件排序,虽然age字段可以用索引排序,但是position字段逆序排序。

image-20230121220740347

可能会不太好理解,这里结合图说明一下

image-20230121221138310

索引是先通过age字段排序,然后对age字段相同的记录,进行position逆序排序,最终查询出的结果是这样的

image-20230121221406010

所以position字段需使用文件排序。

sql5

select * from employees where name = 'zhangsan18' order by age desc,position desc;

索引排序,因为age,position字段都是逆序的,相当于是索引上从右往左遍历

image-20230121221643560

image-20230121221709624

sql6

explain select * from employees where name > 'zhangsan18' order by age,position;

文件排序,因为name走范围查询,age字段走不了索引了。同上篇索引优化一中sql5的分析

image-20230121222001356

sql7

explain select * from employees where name >= 'zhangsan18' order by age,position;

依旧是文件排序,如果你看了上文,你可能又会有疑惑了:age字段不是会走索引吗?咋是文件排序勒?

这里再强调一遍:走索引是走索引,排序是排序。

没错,在name=zhangsan18时,age,position是有序的,可以使用索引排序。

但是在name>zhangsan18时,age,position是无序的,需要使用文件排序。

image-20230121222646265

15,25,16,33:无序的对吧

好了,关于排序的案例就到这里,更多的案例就还是由你自己去探索吧

什么是文件排序?

文件排序分为单路排序和双路排序

单路排序

一次性取出满足条件行的所有字段,然后在sort buffer中进行排序

双路排序

首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行id(主键),然后在sort buffer中进行排序,排序完后需要再次取回其它需要的字段。

MySQL是选择用哪种排序的?

MySQL通过比较系统变量max_length_for_sort_data(默认1024字节)的大小和需要查询的字段总大小来判断使用哪种排序模式。

  • 如果字段的总长度小于max_length_for_sort_data ,那么使用单路排序模式
  • 如果字段的总长度大于max_length_for_sort_data ,那么使用双路排序模式。

小结

1、如果可以使用索引排序,尽量使用索引排序,但是实在没有办法进行索引排序也不要勉强,优先对where筛选语句做索引优化,因为筛选出的数据往往是很少的,排序成本很低。

2、如果没有办法使用文件排序,服务器内存又充足的情况下,那么可以适当调整下max_length_for_sort_data,让MySQL使用单路排序,这样可以减少回表,效率会好一些。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
201 66
|
19天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
118 9
|
2月前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
2天前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
43 22
 MySQL秘籍之索引与查询优化实战指南
|
4天前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
21 10
|
24天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
61 18
|
16天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
48 8
|
23天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
22 7
|
22天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
57 5
|
26天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
108 7