SQL:索引问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
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 数据库 开发者
MSSQL性能调优实战技巧:索引优化、SQL语句微调与并发控制策略
在Microsoft SQL Server(MSSQL)的管理与优化中,性能调优是一项复杂但至关重要的任务
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战策略:索引优化、SQL语句重构与并发控制
在Microsoft SQL Server(MSSQL)的管理和优化过程中,性能调优是确保数据库高效运行、满足业务需求的重要环节
|
1月前
|
SQL 运维 监控
MSSQL性能调优实战:索引优化、SQL查询效率提升与并发控制策略
在Microsoft SQL Server(MSSQL)的日常运维与性能优化中,精准的策略与技巧是实现高效数据库管理的关键
|
1月前
|
SQL 数据库 开发者
MSSQL性能调优实战:索引策略、SQL优化与并发管理深度剖析
在Microsoft SQL Server(MSSQL)的性能调优过程中,索引策略、SQL查询优化以及并发管理是关键的三大支柱
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战技巧:索引优化策略、SQL查询重构与并发控制详解
在Microsoft SQL Server(MSSQL)的管理与优化过程中,性能调优是确保数据库高效运行的关键环节
|
1月前
|
SQL 运维 监控
MSSQL性能调优实战:索引深度优化、SQL查询技巧与高效并发控制
在Microsoft SQL Server(MSSQL)的运维环境中,性能调优是确保数据库高效、稳定运行的核心任务
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战指南:精准索引策略、SQL查询优化与高效并发控制
在Microsoft SQL Server(MSSQL)的性能调优过程中,精准索引策略、SQL查询优化以及高效并发控制是三大核心要素
|
25天前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之相同的SQL语句在不同时间执行EXPLAIN计划显示出不同的索引类型,是什么原因
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之相同的SQL语句在不同时间执行EXPLAIN计划显示出不同的索引类型,是什么原因
|
27天前
|
存储 SQL 索引
面试题MySQL问题之使用SQL语句创建一个索引如何解决
面试题MySQL问题之使用SQL语句创建一个索引如何解决
32 1
|
1月前
|
SQL 监控 数据库
MSSQL性能调优实战:索引策略优化、SQL查询重写与高效并发管理的具体技巧
在Microsoft SQL Server(MSSQL)的性能调优过程中,索引策略的优化、SQL查询的重写以及高效并发管理是关键环节