SQL:索引问题

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

@[toc]

一 索引

1)索引之无索引案例

问题描述

用户系统打开缓慢,数据库CPU 100%

问题排查

发现数据库中大量的慢SQL,执行时间长超过了 2 s

慢SQL

select id from 'user' where user_no=13772556391 limit 0,1;

执行计划

mysql>explain select id from 'user' where user_no=13772556391 limit 0,1;
mysql>explain SELECTid FROM `user`WHERE user_no=13772556391 LIMITO,1; id:1 select_type:SIMPLE table:user type:ALL possible_keys:NULL key:NULL key_len:NULL ref:NULL rows:707250 Extra:Using where

关键信息

type:ALL
key:null

说明是全表扫描

执行时间

mysql> select id from 'user' where user_no=13772556391 limit 0,1
mysql>~SELECT id FROM `user' WHERE user_no=13772556391 LIMIT O,1; 
Empty set (2.11 sec)

表结构

CREATE TABLE `user`( 
 `id`int(11)unsigned NOT NULL AUTO INCREMENT COMMENT'id',
 `pid`int(11) unsigned NOT NULL DEFAULT'0', 
 `email` char(60) NOT NULL, 
 `name`char(32)NOT NULL DEFAULT,
 `user_no`char(11)NOT NULL DEFAULT… 
 PRIMARY KEY(id`), 
 UNIQUE KEYemail`(email`) 
 KEY`pid`(pid`) 
)ENGINE=InnoDB ENGINE=InnoDB AUTO_INCREMENT=972600 DEFAULT CHARSET=utf8;

查看表结构
所查找的user 列是没有ID
验证字段的过滤性

mysql> select count(*) from user where user_no=13772556391;
mysql> select count(*)from user where user_no=13772556391;
+--------+
|count(*)|
+--------+
|    0   |
+--------+
1 row in set (0.05 sec)

解决:添加索引

mysql> alter table user add index ind_user_no(user_no);

再次查看:执行时间

mysql> select id from 'user' where user_no=13772556391 limit 0,1
mysql>SELECT id FROM `user` WHERE user_no=13772556391 LIMIT 0.1;
Empty set(0.05 sec)

再次查看:执行计划

mysql>explain select id from 'user' where user_no=13772556391 limit 0,1\G;
mysql> explain SELECT id FROM `user`WHERE user_no=13772556391 LIMIT 0,1\G; row ,*************************** 
id:1 
select_type:SIMPLE 
table: user 
type:index 
possible_keys:ind_user_no 
key:ind_user_no 
key_len:33 
ref:NULL 
rows:707250 
Extra:Using where; 
Using index 

2)索引之隐式转换案例:

为什么索引的过滤性这么差?

mysql> explain extended select id from`user`where user_no=13772556391 limit 0,1; 
mysql> show warnings; 
Warning1:Cannotuse index'ind_user_no'due to type or collation conversion on field'user_no 
Note:select `user`.id`ASid`from`user`where(`user`.`user_no`=13772556391)limit 0,1

表结构

CREATE TABLE `user`(
 `user_no`char(11)NOT NULL DEFAULT
)ENGINE=InnoDB;

由于查询条件user_no=13772556391是没有加引号,是整型,而表结构是字符型,所以涉及到类型转换

改进查询条件

添加引号,可以看到rows:1

索引问题的最佳实践

  1. 通过explain查看sql的执行计划

判断是否使用到了索引以及隐式转换

  1. 常见的隐式转换

包括字段数据类型以及字符集定义不当导致

  1. 设计开发阶段

避免数据库字段定义与应用程序参数定义出现不一致
不支持函数索引,避免在查询条件加入函数:date(a.gmt_create)

  1. SQL审核

所有上线的SQL都要经过严格的审核,创建合适的索引

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
69 2
|
21天前
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
|
27天前
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引:详细技巧与方法
在数据库管理中,索引是提高SQL查询性能的重要手段
|
2月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
504 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
2月前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
26天前
|
SQL 存储 关系型数据库
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构
|
2月前
|
SQL 存储 索引
SQL Server的Descending Indexes降序索引
【9月更文挑战第21天】在SQL Server中,降序索引允许指定列的排序顺序为降序,可显著优化涉及降序排序的查询性能,特别是在复合索引中。通过创建降序索引,可以更高效地满足特定业务需求,如按交易时间降序获取最新记录。然而,使用时需考虑查询频率、数据分布及维护成本,以确保最佳性能。
|
27天前
|
SQL 存储 关系型数据库
SQL默认索引是什么
在SQL数据库中,索引是一种用于提高查询性能的数据结构
|
27天前
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引
在数据库管理和优化过程中,确认SQL查询是否使用了索引是一个至关重要的步骤
|
1月前
|
SQL 关系型数据库 MySQL
如何确认SQL查询是否使用了索引:详细步骤与技巧
在数据库管理和优化中,确认SQL查询是否有效利用了索引是提升性能的关键步骤