首页 > 数据库 >mysql优化-索引失效场景

mysql优化-索引失效场景

时间:2024-08-10 20:53:19浏览次数:13  
标签:name 索引 emp mysql 失效 where select first

1. 索引字段不独立

  • 索引字段进行了表达式计算
  • 事先计算好表达式的值,再传过来,避免在SQL where条件=的左侧做计算
select *
from employees
where emp_no + 1 = 10003;

select *
from employees
where emp_no = 10002;

索引字段是函数的参数

预先计算好结果,再传过来,在where条件的左侧,不要使用函数;或者使用等价的SQL

select *
from employees
where SUBSTRING(first_name, 1, 3) = 'Geo';

select *
from employees
where first_name like 'Geo%';

2. 使用了左模糊

尽量避免使用左模糊,如果避免不了,可以考虑使用搜索引擎去解决

select *
from employees
where first_name like '%Geo%';

select *
from employees
where first_name like 'Geo%';

3. 使用OR查询的部分字段没有索引

分别为first_name以及last_name字段创建索引

union 替代 or

select *
from employees
where first_name = 'Georgi'
or last_name = 'Georgi';

4. 字符串条件未使用''引起来

规范地编写SQL

select *
from dept_emp
where dept_no = 3;

select *
from dept_emp
where dept_no = '3'

5. 不符合最左前缀原则的查询

存index(last_name, first_name)

explain select *
from employees
where first_name = 'Facello';

调整索引的顺序,变成index(first_name,last_name)/index(first_name)

Mysql 8 之后会进行跳表扫描

6. 索引字段建议添加NOT NULL约束

  • 单列索引无法储null值,复合索引无法储全为null的值
  • 查询时,采用is null条件时,不能利用到索引,只能全表扫描

官方建议尽量把字段定义为NOT NULL

MySQL :: MySQL 8.0 Reference Manual :: 10.4.1 Optimizing Data Size

select *
from `foodie-shop-dev`.users
where mobile is null;

把索引字段设置成NOT NULL,甚至可以把所有字段都设置成NOT NULL并为字段设置默认值

7. 隐式转换导致索引失效

select emp.*, d.dept_name
from employees emp
left join dept_emp de
on emp.emp_no = de.emp_no
left join departments d
on de.dept_no = d.dept_no
where de.emp_no = '100001';

在创建表的时候尽量规范一点,比如统一用int,或者bigint

8. 使用不等于的时候无法使用索引会导致全表扫描

9. 不能使用索引中范围条件右边的列 范围之后失效

10. 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select

11. asc和desc混用

标签:name,索引,emp,mysql,失效,where,select,first
From: https://blog.csdn.net/qq_26594041/article/details/141095340

相关文章

  • Java中的灵活缓存失效策略设计:从TTL到LRU的实现
    Java中的灵活缓存失效策略设计:从TTL到LRU的实现大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!缓存失效策略在现代应用程序中至关重要,它决定了缓存数据的更新和淘汰机制。本文将探讨在Java中如何实现灵活的缓存失效策略,包括TTL(Time-To-Live)和LRU(Le......
  • CUDA--内存访问越界或无效的索引操作解决办法
    报错信息File"D:\anaconda3\envs\HCAVE2\lib\site-packages\torch\nn\utils\rnn.py",line258,inpack_padded_sequencesorted_indices=sorted_indices.to(input.device)RuntimeError:CUDAerror:device-sideasserttriggeredCUDAkernelerrorsm......
  • CUDA--内存访问越界或无效的索引操作解决办法--总结
    设备端的断言错误(device-sideasserttriggered)通常发生在CUDA代码中访问无效的内存地址或执行了无效的操作。解决这种错误需要系统地排查代码中的潜在问题。以下是详细的解决方案:1.检查数组边界确保所有访问数组或指针的操作都在有效范围内。检查线程索引和块索引的计算,确......
  • MySQL基础详解(2)
    文章目录多表查询MySQL函数数字函数字符串函数日期函数高级函数使用Python操作MySQL1、安装第三方模块pymysql2、操作MySQLMySQL中的多表查询是数据库操作中非常常见且重要的一个环节,多表查询是数据库查询中非常强大的功能,能够让你根据需要从多个表中提取和组合数......
  • MySQL基础详解(1)
    文章目录Sql1.什么是Sql2、SQL通用语法3、SQL分类DDL:操作数据库、表3.1操作数据库:CRUD3.2操作表CRUDDML:增删改表中数据1.添加数据:2.删除数据:3.修改数据:DQL:查询表中的记录1.语法:2.基础查询3.条件查询4.排序查询其他函数5.聚合函数6.分组查询7.分页查询:DCL:管理用户......
  • MySQL的安装
    文章目录在线安装方式离线安装方式1、卸载已有的MySQL文件2、安装mysql3、后续命令修改字符集MySQL是一种开源的关系型数据库管理系统(RDBMS),由瑞典MySQLAB公司开发,后来被SunMicrosystems收购,并最终归属于Oracle公司。MySQL因其高性能、可靠性、扩展性和安全性而广......
  • MySQL高级知识-----Explain
    Explainexplain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。1.explain的作用通过explain+sql语句可以知道如下内容:1.表的读取顺序。(对应id)......
  • Flutter中scroll_to_index 实现列表滚动到指定索引的库
    scroll_to_index 是一个用于在Flutter中实现列表滚动到指定索引的库依赖scroll_to_index:^3.0.1#滑动位置使用classScrollToIndexExampleextendsStatefulWidget{@override_ScrollToIndexExampleStatecreateState()=>_ScrollToIndexExampleState();}cl......
  • MySQL实战攻略
    1.数据库概述1.1聊聊数据库数据库是一门独立的学科,只要是做软件开发的,数据库都要学。数据库(电子化的文件柜)是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。它的存储空间很大,可以存放百万条......
  • Ubuntu24.04安装 Mysql 并修改root密码 + 配置
    参考文章:Ubuntu安装MySQL一、下载并安装MySQL1、安装mysql服务端yammie@my-pc>/opt$sudoapt-getinstallmysql-server2、安装mysql客户端yammie@my-pc>/opt$sudoapt-getinstallmysql-client3、安装程序编译时连接的库yammie@my-pc>/opt$sudoapt-......