28个案例问题分析---012---数据库数据类型问题--Mysql数据类型,索引失效

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 28个案例问题分析---012---数据库数据类型问题--Mysql数据类型,索引失效

Mysql数据类型+索引失效

四:总结

一:背景介绍

MySql数据库的is_delete字段,两个不同的表,一个表内有217069条数据,另一个表内有76015条数据,查询起来发现速度特别的慢,推测是索引失效的问题,让我们来尝试进复现二:思路&方案

Mysql数据类型

在进行验证之前,我们先来学习一下mysql的三种数据类型。Mysql主要分为三种类型** 数值**、日期/时间和**字符串(字符)**类型。

数值类型

类型 大小(bytes) 范围(无符号) 范围(带符号) 用途
tinyint 1 (-128,127) (0,255) 小整数值
smallint 2 (-32 768,32 767) (0,65 535) 大整数值
mediumint 3 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
int 4 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
bigint 8 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值

日期/时间类型

类型 大小(bytes) 范围 格式 用途
date 3 1000-01–1/9999-12.31 YYYY-MM_DD 日期值
time 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
year 1 1901/2155 YYYY 年份值
datetime 8 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ YYYY-MM_DD hh:mm:ss 混合日期和时间值
timestamp 4 有专有的自动更新特性 YYYY-MM_DD hh:mm:ss 混合日期和时间值,时间戳

字符串(字符)类型

类型 大小(bytes) 用途
char 0 - 255 定长字符串
varchar 0 - 65 535 变长字符串
tinyblob 0 - 255 不超过255个字符的二进制字符串
tinytext 0 - 255 短文本字符串
blob 0 - 65535 二进制形式长文本数据
text 0 - 65535 长文本数据
mediumblob 0 - 16 777 215 二进制形式的中等长度文本数据
mediumtext 0 - 16 777 215 中等长度文本数据
longblob 0 - 4 294 967 295 二进制形式极大文本数据
longtext 0 - 4 294 967 295 极大文本数据

索引失效复现

首先我们摆出结论。where条件里,字符类型的列如过传递数值类型可以查出来数据,但是会索引失效。

对应的索引
is_delete 字段的类型
使用数值型进行查询我们使用EXPLAIN关键字分析可以发现。type是 ALL,也就是全表扫描,并没有走索引。

使用字符型查询我们发现 type类型变成了ref,说明是走了我们新建的索引的。


结论

数值类型的的转换,会使我们的索引失效,所以我们设计实体类的数值类型的时候,一定要和数据库的数据类型进行对应,避免索引失效的情况的出现。


三:扩展

既然这次出现了索引失效,那么我们就总结一下,常见的索引失效的情况。


索引失效

对索引使用左或者左右模糊匹配

使用 %xx 或者 %xx% 都会造成索引失效问题。但是 xx% 不会造成索引失效。


对索引使用函数

在where条件里,使用函数。比如 select * from user where length(name) = 6

这里进行的就是全表扫描,因为索引里存储的是列的原始值而不是计算后的值


对索引进行表达式计算

例如:select * from user where age + 1 = 10 。

这里也将会进行全表扫描,原因与对索引使用函数一样,都是因为索引内存储的是原始值而不是计算后的值。但是如果将上文的查询修改为 select * from user where age = 10 - 1 的话就没有问题,是会正常走age的索引的


对索引隐式类型转换

我们上文讲到,mysql有三种数据类型,分别是 数值型、日期型、字符型 ,能够隐式转换的就是 数值型和字符型了。

1.如果索引字段是字符型,但是条件查询时,传入的是整型的话,会出现索引失效问题。

2.如果索引是整型,但是条件查询的时候,传入的是字符型,不会出现索引失效问题。

这是因为mysq在遇到字符串和数字比较的时候,会默认将字符串转换为数值类型进行处理


联合索引非最左匹配

假设我们对字段 a,b ,c 建立了一个联合索引(a,b,c)。

如果我们的查询是以下几种,则会正常走联合索引:


where a = 1;

where a = 2 and b = 2;

where a = 2 and b = 2 and c = 2;

如果是如下几种则不会走联合索引:


where b = 2;

where c = 2;

where b = 2 and c = 3;

通过对比我们可以看出,索引的生效是遵循最左匹配原则的。在使用的时候,必须从最左侧的索引开始。


还有一种特殊的情况


where a = 2 and c = 2 ;

这种情况的话,在MySql 5.5的时候,前面的a会走索引,找到对应的主键值后,开始进行回表查询。Mysql 5.6 后,会进行索引下推,速度更快。索引还是会生效。


WHERE 子句中的 OR

如果where 子句里 or前的列是索引列,or后面的条件列不是索引列,索引就会失效。

例如:

select * from user where id = 2 or age = 10 ;

id是主键,默认是主键索引。 age如果没有添加为主键的话,都会进行全表扫描。 因为or表示两个条件满足一个就可以。所以只有一个列有索引的话,没有作用,还是会去全表扫描。


四:总结

开发的过程中,要谨记这些索引失效的大坑,这样以后我们在使用的时候,才能够避免!!


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
14天前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
52 3
|
8天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
8天前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
8天前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
14天前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
60 1
|
14天前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
29天前
|
安全 关系型数据库 MySQL
MySQL安全最佳实践:保护你的数据库
本文深入探讨了MySQL数据库的安全防护体系,涵盖认证安全、访问控制、网络安全、数据加密、审计监控、备份恢复、操作系统安全、应急响应等多个方面。通过具体配置示例,为企业提供了一套全面的安全实践方案,帮助强化数据库安全,防止数据泄露和未授权访问,保障企业数据资产安全。
|
20天前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
2月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
14天前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
189 7

推荐镜像

更多