SQL:索引问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 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都要经过严格的审核,创建合适的索引

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
6月前
|
SQL 存储 关系型数据库
SQL优化策略与实践:组合索引与最左前缀原则详解
本文介绍了SQL优化的多种方式,包括优化查询语句(避免使用SELECT *、减少数据处理量)、使用索引(创建合适索引类型)、查询缓存、优化表结构、使用存储过程和触发器、批量处理以及分析和监控数据库性能。同时,文章详细讲解了组合索引的概念及其最左前缀原则,即MySQL从索引的最左列开始匹配条件,若跳过最左列,则索引失效。通过示例代码,展示了如何在实际场景中应用这些优化策略,以提高数据库查询效率和系统响应速度。
207 10
|
7月前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
1022 2
|
8月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
216 2
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
1522 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
192 3
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引:详细技巧与方法
在数据库管理中,索引是提高SQL查询性能的重要手段
2118 5
|
SQL 存储 索引
SQL Server的Descending Indexes降序索引
【9月更文挑战第21天】在SQL Server中,降序索引允许指定列的排序顺序为降序,可显著优化涉及降序排序的查询性能,特别是在复合索引中。通过创建降序索引,可以更高效地满足特定业务需求,如按交易时间降序获取最新记录。然而,使用时需考虑查询频率、数据分布及维护成本,以确保最佳性能。
225 2