首页 > 数据库 >MySQL学习进阶篇Day5

MySQL学习进阶篇Day5

时间:2023-05-30 20:24:38浏览次数:57  
标签:索引 where explain Day5 进阶篇 user MySQL tb select

2.6.4 索引失效情况

2.6.4.1 索引列运算

不要在索引列上进行运算操作, 索引将失效。

 

在tb_user表中,除了前面介绍的联合索引之外,还有一个索引,是phone字段的单列索引。

 

A. 当根据phone字段进行等值匹配查询时, 索引生效。

explain select * from tb_user where phone = '17799990015';

 

 

B. 当根据phone字段进行函数运算操作之后,索引失效。

explain select * from tb_user where substring(phone,10,2) = '15';

 

2.6.4.2 字符串不加引号

字符串类型字段使用时,不加引号,索引将失效。

 

接下来,我们通过两组示例,来看看对于字符串类型的字段,加单引号与不加单引号的区别:

explain select * from tb_user where profession = '软件工程' and age = 31 and status
= '0';
explain select * from tb_user where profession = '软件工程' and age = 31 and status
= 0;

 

 

 

explain select * from tb_user where phone = '17799990015';
explain select * from tb_user where phone = 17799990015;

 

 

 

经过上面两组示例,我们会明显的发现,如果字符串不加单引号,对于查询结果,没什么影响,但是数 据库存在隐式类型转换,索引将失效。

 

2.6.4.3 模糊查询

如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

 

接下来,我们来看一下这三条SQL语句的执行效果,查看一下其执行计划:

由于下面查询语句中,都是根据profession字段查询,符合最左前缀法则,联合索引是可以生效的, 我们主要看一下,模糊查询时,%加在关键字之前,和加在关键字之后的影响。

explain select * from tb_user where profession like '软件%';
explain select * from tb_user where profession like '%工程';
explain select * from tb_user where profession like '%工%';

 

经过上面两组示例,我们会明显的发现,如果字符串不加单引号,对于查询结果,没什么影响,但是数 据库存在隐式类型转换,索引将失效。

 

6.4.4 or连接条件

用or分割开的条件,  如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。

explain select * from tb_user where id = 10 or age = 23;
explain select * from tb_user where phone = '17799990017' or age = 23;

 

 由于age没有索引,所以即使id、phone有索引,索引也会失效。所以需要针对于age也要建立索引。

 

然后,我们可以对age字段建立索引。

 

create index idx_user_age on tb_user(age);

 

 

建立了索引之后,我们再次执行上述的SQL语句,看看前后执行计划的变化。

 

最终,我们发现,当or连接的条件,左右两侧字段都有索引时,索引才会生效。

 

3.6.4.5 数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引。

select * from tb_user where phone >= '17799990005';
select * from tb_user where phone >= '17799990015';

 

 经过测试我们发现,相同的SQL语句,只是传入的字段值不同,最终的执行计划也完全不一样,这是为 什么呢?

 

就是因为MySQL在查询时,会评估使用索引的效率与走全表扫描的效率,如果走全表扫描更快,则放弃 索引,走全表扫描。 因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不 如走全表扫描来的快,此时索引就会失效。

 

接下来,我们再来看看 is null 与 is not null 操作是否走索引。

 

执行如下两条语句 :

explain select * from tb_user where profession is null;
explain select * from tb_user where profession is not null;

 

 

接下来,我们做一个操作将profession字段值全部更新为null。

 

然后,再次执行上述的两条SQL,查看SQL语句的执行计划。

 

最终我们看到,一模一样的SQL语句,先后执行了两次,结果查询计划是不一样的,为什么会出现这种现象,这是和数据库的数据分布有关系。查询时MySQL会评估,走索引快,还是全表扫描快,如果全表扫描更快,则放弃索引走全表扫描。  因此,is null 、is not null是否走索引,得具体情况具体分析,并不是固定的。

 

标签:索引,where,explain,Day5,进阶篇,user,MySQL,tb,select
From: https://www.cnblogs.com/beichens/p/17444279.html

相关文章

  • mysql8和pgsql10你选哪个?
    手里有个云服务器1核1G,ubuntu20.04,经常用来测试一些开源应用。刚好有个应用需要数据库支持,或者mysql8,或者pgsql10。显然mysql用起来更得心应手,可是安装不上mysql8,显然内存不够,无奈只好试下pgsql,安装竟然非常顺畅。安装了pgsql12,目前占用内存也就130M左右起了一个应用,统计一下......
  • 小灰灰深度学习day5——数据预处理
    内容简介:1.将数据写入.csv文件中    2.将数据从.csv文件中读出  3.利用插值法处理缺失的数据  4.将数据类型转化为torch张量类型代码如下:importosos.makedirs(os.path.join('..','data'),exist_ok=True)data_file=os.path.join('..','data','house_......
  • mysql中update会锁表吗
    MySQL中的update操作会不会锁表是一个值得关注的问题,因为这会影响到并发性能和系统的响应速度。本文将从两个方面探讨这个问题:一是有没有索引的情况下,二是MySQL开启了自动提交事务和手动提交事务的情况下。首先,在没有索引的情况下,MySQL的update操作会锁整个表。这是因为在......
  • MySQL之常用函数介绍
    一:函数的简介函数可以把我们经常使用的代码封装起来,需要的时候直接调用即可。这样既提高了代码效率,又提高了可维护性。在SQL中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数,可以极大地提高用户对数据库的管理效率。我们在使用SQL语言的时候,不是直接和这门......
  • mysql执行优化器
    sql这个ql看着给人感觉t表是驱动表,其实优化器优化后trc才是驱动表,因为t的查询条件筛选出来有50多万,二trc筛选只有几千条explainselectdistinctt.`id`as"id",t.deletedas"deleted",t.noas"no",ru.nameas"requester_name",tm.solve_minutesas"ticketMetric......
  • MySQL之DQL数据查询操作
    一:SQL概述及规范SQL(StructuredQueryLanguage,结构化查询语言)是使用关系模型的数据库应用语言,与数据直接打交道,由IBM上世纪70年代开发出来。后由美国国家标准局(ANSI)开始着手制定SQL标准,先后有SQL-86,SQL-89,SQL-92,SQL-99等标准。SQL有两个重要的标准,分别是SQL92和SQL99,它们......
  • mysql索引损坏,Record in index `log_time` of table `lts`.`lts_job_log_po` was not
    【1】错误信息[ERROR][MY-012869][InnoDB]Recordinindex`log_time`oftable`lts`.`lts_job_log_po`wasnotfoundonupdate:TUPLE(info_bits=0,2n_cmp=2,fields)2023-05-29T23:03:05.146242Z193[ERROR][MY-013183][InnoDB]Assertionfailure:row0upd.cc:......
  • Mysql DDL执行方式-pt-osc介绍 | 京东云技术团队
    1引言大家好,接着上次和大家一起学习了《MySQLDDL执行方式-OnlineDDL介绍》,那么今天接着和大家一起学习另一种MySQLDDL执行方式之pt-soc。在MySQL使用过程中,根据业务的需求对表结构进行变更是个普遍的运维操作,这些称为DDL操作。常见的DDL操作有在表上增加新列或给某个列添加......
  • Mysql:数据库优化步骤
    数据库优化步骤查看mysql是否存在周期性波动1.1是。代表可能遇上如618,双十一等活动对数据库暂时性的压力增大,可以mysql加缓存或更改缓存策略1.2不是。大概率是本身开发人员编写的SQL有问题,或者是业务量达到一定程度引发的查询慢非周期性波动调优思路开启慢查询,并设定慢......
  • MySQL数据库A表和B表id冲突解决办法?
    方法1:不要定义自增长,用触发器来实现。方法2:不要定义自增长,两张表共享同一个sequence。(规则唯一)方法3:自增长,但是一张表是奇数,另一张全是偶数基于触发器的方法三:(对于现有系统的补救方案),最好的方案还是方法二使用同一个自增sequence获取--修改A表id别和B表id重复--查询最大的......