索引对MYSQL性能的影响

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 索引到底对性能有多少影响?这个问题估计是很多MySQL小白好奇的问题。当然我也是一样。因为之前的时候,并没有对索引有太多的注意,而且之前的工作经历,因为数据量很小,索引所起到的作用并不是很大,所以也没有太大注意。

索引到底对性能有多少影响?

这个问题估计是很多MySQL小白好奇的问题。当然我也是一样。因为之前的时候,并没有对索引有太多的注意,而且之前的工作经历,因为数据量很小,索引所起到的作用并不是很大,所以也没有太大注意。


事情的起点

我在公司是做后端开发(PHPer),除了日常的开发工作,也要兼职公司的运维。每周安排一个人跟进报警邮件,出现问题及时通报。


像很多创业公司的一样,我们选用的是阿里云的ECS+RDS。因为如果自己购买服务器,不管是运维成本还是物理成本都是比较高的。


一天将近半夜12点的时候,报警日志突然出现了MySQL server has gone away


遇到问题肯定是先Baidu,我找到了MySQL官方的解释,原因是查询的时候,出现的mysql断开的情况。我登录阿里云rds后台,发现wait_timeout时间长得很。不应该会出现超时的情况。


一个同事:“会不会和rds经常CPU报警有关?”


我勒个去,我查了一下rds监控,果然CPU持续升高。


问题跟进

rds自带了日志系统,可以方便。查看了一下慢日志系统,果然有很多的慢SQL日志。


我曹,每次扫描了8W多行。看来是没有使用到索引。加上次数频繁,解析的总次数高达 1762833762 行。


定位问题

查看MySQL的执行计划

mysql> explain extended SELECT * FROM `test` WHERE `is_deleted` =0 AND `a` = 81644;
+----+-------------+-----------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+-----------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | test | ALL  | a_index      | NULL | NULL    | NULL | 86172 | Using where |
+----+-------------+-----------+------+---------------+------+---------+------+-------+-------------+
1 row in set, 3 warnings (0.01 sec)
mysql> show warnings;
| Level   | Code | Message                                                                                             
| Warning | 1739 | Cannot use ref access on index 'a_index' due to type or collation conversion on field 'a'                                                                                                 |
| Warning | 1739 | Cannot use range access on index 'a_index' due to type or collation conversion on field 'a'


果然是没有用到索引,全表扫描。


原来,由于a数据类型是varchar类型的。但是查询的时候,使用的int类型,在执行SQL语句的时候,由于类型原因,造成了隐式转换。没有用到索引。所以实际上,应该把原来的SQL语句更改成 SELECT * FROM test WHERE is_deleted =0 AND a = '81644'。


虽然原因找到了,但是查询的SQL那么多,定位那具体的php文件以及对于的代码行数,也是一个难题。


PHP慢日志

为了能够定位代码的效率,PHP自带一个功能,那就是慢日志。如果PHP脚本,执行时间比较长的时候,那么PHP会认为这段代码是有问题的,PHP会把代码的基本信息打印到慢日志里面,能够方便开发者定位问题。


这么说来,如果找到慢日志里面关于执行这个SQL的代码,也就能够准确定位到对应的PHP文件。


索引对性能的影响!

接下来用对比图来比较下使用索引和没有使用索引的对比吧


优化之后的SQL执行效率,相比之前要高出很多,CPU占用率稳定保持在个位数,甚至 5%一下,相比之前80%左右,呈现指数的翻倍。


总结

其实隐式转换是MySQL索引经常遇到的问题。我最开始听说是前段时间,阿里云组织了一个慢SQL的优化大赛。虽然没有得到名次,但是确实通过大赛,学到了很多关于索引的知识。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
119 9
|
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
|
11天前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
|
2月前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
57 2