[MySQL]SQL优化之索引的使用规则

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: [MySQL]SQL优化之索引的使用规则

?键盘敲烂,年薪30万?



一、索引失效

?最左前缀法则

规则:

  1. 最左侧的列必须存在,如果不存在,索引失效,和位置无关!!!
  2. 从索引的最左侧开始,不能跳跃某一索引列,如果跳过某一列,那么后面的索引都会失效。

例如:

  • 有联合索引 id_name_age_gender (name字段为最左列)

遵循法则:select * from user where name = 'zhang' and age = 12 and gender = 1;

遵循法则:select * from user where age = 10 and name = 'zhang';

不遵循法则:select * from user where age = 10 and gender = 1;

?范围查询>

范围查询右侧的列索引失效

例如: > < 号会使索引失效

select * from user where age > 10;

故:

尽量使用 >= 或者 <=

?索引列运算,索引失效

对索引列进行运算,索引失效,因为运算完之后新的数据不具有索引结构

select * from user where substring(name, 0 ,2) = 'zh';

 

?前模糊匹配

%在最左侧索引失效

索引失效:select * from user where name like '%hang';

索引不失效:select * from user where name like 'zhan%';

?or连接的条件

使用or连接的字段索引都会失效

select * from user where id = 1 or name = 'zhang';
?字符串类型不加 ''

如果数据库字段类型为varchar 但是查询每加'',索引失效

select * from user where name = zhang;
?数据分布

如果MySQL经过判断之后发现全表扫描比按索引查询快,就会走全表扫描

?is not null

如果一列数据基本没有null,is not null就会使索引失效

二、SQL提示:

例如:有两个索引 id_name_age   id_name

执行:select * from user where name = 'zhang';

会走哪个索引呢?

  • 这时mysql经过优化后会选择一个索引,但是性能不一定最佳,因此可以指定索引。
①建议索引
select * from user use index(id_name) where name = 'zhang';

注意:提出的建议,mysql不一定听。

②强制索引
select * from user force index(id_name) where name = 'zhang';
③忽略索引
selct * from user ignore index(id_name_age) where name = 'zhang';

三、覆盖索引

查询使用了索引,并且查询的字段 (select 后面的字段) 在该索引中可以全部找到。

例如:

  • 回表查询

故:

尽量避免使用select * ,这很容易导致回表查询。

四、前缀索引

可以将字符串的一部分抽取出来作为前缀创建索引

例如:选取前4个字符作为name字段的索引

create index id_name on user(name(4));

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
SQL 存储 关系型数据库
Mysql优化提高笔记整理,来自于一位鹅厂大佬的笔记,阿里P7亲自教你
Mysql优化提高笔记整理,来自于一位鹅厂大佬的笔记,阿里P7亲自教你
|
3天前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法? 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法? 窗口函数
|
4天前
|
SQL 存储 关系型数据库
【MySQL】SQL 优化
【MySQL】SQL 优化
20 0
|
2天前
|
缓存 关系型数据库 MySQL
如何优化MySQL数据库查询性能
MySQL是一款常用的关系型数据库,但在实际使用过程中,由于数据量增加和查询操作复杂度增加,会导致查询性能下降。本文将介绍一些优化MySQL数据库查询性能的方法。
|
2天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之从MySQL到Flink 1.16.2 Flink-SQL的数据同步工作出现了一个异常如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
14 0
|
3天前
|
SQL 存储 数据处理
实时计算 Flink版产品使用合集之flink-connector-mysql-cdc 和 flink-sql-connector-mysql-cdc有什么区别
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
12 1
|
3天前
|
存储 关系型数据库 MySQL
MySQL各字符集、排序规则的由来、用法,区别和联系
MySQL支持多种字符集和排序规则,这些在数据库设计和数据处理中起着重要作用。下面是它们的由来、用法、区别和联系: 1. **字符集(Character Set)**: - **由来**:字符集定义了数据库中可以存储的字符集合,以及这些字符在数据库中的存储方式。 - **用法**:在创建数据库或表时,可以指定所需的字符集。常见的字符集包括UTF-8、UTF-16、Latin1等。 - **区别和联系**:不同的字符集支持不同的字符范围和存储方式,选择合适的字符集可以确保数据的正确存储和处理。例如,UTF-8支持全球范围内的大多数字符,而Latin1只支持西欧语言字符集。
|
4天前
|
SQL 存储 关系型数据库
必知的 MySQL 索引失效场景【包括实践验证】,别再踩坑了!(下)
必知的 MySQL 索引失效场景【包括实践验证】,别再踩坑了!
22 2
|
4天前
|
SQL 关系型数据库 MySQL
必知的 MySQL 索引失效场景【包括实践验证】,别再踩坑了!(上)
必知的 MySQL 索引失效场景【包括实践验证】,别再踩坑了!
19 2
|
4天前
|
NoSQL 关系型数据库 MySQL
B+树 和 跳表 的结构及区别,不同的用途【mysql的索引为什么使用B+树而不使用跳表?】
B+树 和 跳表 的结构及区别,不同的用途【mysql的索引为什么使用B+树而不使用跳表?】
21 2
http://www.vxiaotou.com