MySQL索引优化(一)

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

MySQL索引优化(案例)


索引单表优化


案例:


(1)首先建立一个article表:


202002131109443.png


往其中插入三条数据:


20200213111035955.png

(2)查询category_id为1且comments大于1的情况下,views最多的article_id


 select id,author_id from article where category_id=1 and comments>1 order by views desc limit 1;

查询结果如下:

20200213111257340.png

使用explain语句来分析这条sql语句写得好不好

explain select id,author_id from article where category_id=1 and comments>1 order by views desc limit 1;

结果如下:


20200213111543656.png


type为ALL:说明是全表扫描,不好

Extra显示Using filesort:说明MySQL中无法用索引来排序,所以MySQL会用外部排序——即文件内排序来排序数据并返回查询结果,这样子也不好


(3)我们来查询一下article表的索引(其实是没有的,因为建表时只是将id设为了主键,没有建立除主键索引以外的索引)

SHOW INDEX FROM article;

20200213112206957.png


由图可见,索引是主键索引,下面开始优化


优化:


(1)新建索引,发现该索引不合适,删除该索引


由于上述查询语句中用到了category_id,comments,views字段作为查询条件,所以尝试将索引应该建在这三个条件上面

CREATE INDEX idx_article_ccv ON article(category_id,comments,views);

建好索引后再查询一下全部索引:


20200213112957195.png


现在再来分析一下查询语句的性能


explain select id,author_id from article where category_id=1 and comments>1 order by views


20200213113149251.png


发现type字段下的ALL变成了range,用到了idx_article_ccv索引,但是Using filesort还有。


如果sql语句中comments>1条件改为了comments=3,那么性能分析会呈现以下情况:


20200213113845369.png



可以看到,Using filesort没有了,type字段下的range变成了ref。


这就是范围查询带来的索引失效问题,因为按照BTree索引的工作原理,先排序category_id,若遇到相同category_id再排序comments,若遇到相同的comments再排序views,当comments字段在联合索引里处于中间位置时,comments>1条件是一个范围值(range),MySQL无法利用索引再对后面的views部分进行检索,即range类型查询字段后面的索引失效。这个问题会在本文后面得到解决。


现在删除idx_article_ccv索引,重新建立新的索引


(2)重建索引


绕过comments字段,在categroy_id和views字段上建索引:


CREATE INDEX idx_article_cv ON article(category_id,views);


再次使用explain来分析该查询语句的性能


explain select id,author_id from article where category_id=1 and comments>1 order by vi


20200213115331486.png


由图可见,使用了这个索引已经将该sql语句优化到最佳效果!


索引两表优化


案例


(1)建立一个class表和一个book表

class表(id为主键自增):

20200214105228122.png


book表(bookid为主键自增):


20200214105527556.png


(2)使用explain语句进行性能分析


EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book.card;


20200214110239776.png


此时,type为ALL,显然需要优化

(3)对右表book表添加索引


CREATE INDEX idx_book_card ON book(card);


再用explain语句分析(2)中的查询语句,结果如下:


20200214110828351.png


由此可见,性能有明显的提升

现在删去索引idx_book_card

(4)对左表class表添加索引


CREATE INDEX idx_class_card ON class(card);


再用explain语句分析(2)中的查询语句,结果如下:


20200214111147738.png


与(3)中的结果对比可见,将索引建立在右表上性能好。


(5)结论


通过分析可得出结论,如果SQL语句是LEFT JOIN,则在右表建立索引;如果SQL语句是RIGHT JOIN,则在左表建立索引


索引三表优化


(1)再建立一个phone表(phoneid为主键自增),并把这三个表中的索引全部删去


20200214112440441.png

(2)来用explain语句分析以下语句


EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book.card LEFT JOIN phone ON book.c


结果为:


20200214122326879.png


(3)在book表和phone表上的card字段建索引


CREATE INDEX idx_book_card ON book(card);
CREATE INDEX idx_phone_card ON phone(card);


继续用explain语句分析(2)中的SQL语句:

20200214122756262.png



从type属性和rows属性以及Extra属性中看到,建立索引后效率提升了很多


(4)结论:


尽可能减少join语句中的Nested Loop的循环总次数,“永远用小结果集驱动大的结果集;


优化要先优化Nested Loop的内层循环;

保证Join语句中被驱动表上Join条件字段已经被索引;

当无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝啬JoinBuffer的设置

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