当前位置: 首页 > news >正文

mysql索引失效场景与mysql优化方式

索引失效场景

联合索引不满足最左匹配原则

索引列参与了运算,会导致全表扫描,索引失效

索引列参使用了函数

模糊查询时(like语句),模糊匹配的占位符位于条件的左侧

like '%abc',like '%abc%' 都会导致失效,like 'abc%'不会

参数类型与字段类型不匹配,导致类型发生了隐式转换,索引失效

select * from t_user where id_no = 1002

id_no字段类型为varchar,但在SQL语句中使用了int类型,导致全表扫描

查询条件使用or关键字,其中一个字段没有创建索引,则会导致整个查询语句索引失效; or两边为“>”和“<”范围查询时,索引失效

select * from t_user where id = 2 or username = 'Tom2';

select * from t_user where id > 1 or id < 80

两列数据做比较,即便两列都创建了索引,索引也会失效

select * from t_user where id > age

当查询条件为字符串时,使用”<>“或”!=“作为条件查询,有可能不走索引,但也不全是

select * from t_user where id_no <> '1002'

查询条件使用不等进行比较时,需要慎重,普通索引会查询结果集占比较大时索引会失效

select * from t_user where create_time != '2022-02-27 09:56:42'

由于“2022-02-27 09:56:42”是存储过程在同一秒生成的,大量数据是这个时间。执行之后会发现,当查询结果集占比比较小时,会走索引,占比比较大时不会走索引。此处与结果集与总体的占比有关

查询条件使用is null时正常走索引,使用is not null时,不走索引

查询条件使用not in时,如果是主键则走索引,如果是普通索引,则索引失效

查询条件使用not exists时,索引失效

当查询条件涉及到order by、limit等条件时,是否走索引情况比较复杂

如何优化慢sql(索引,语句,表结构,数据量,分库分表,连接池参数,缓冲池参数,I/O参数)

使用索引:创建合适的索引可以大大加快查询速度。在选择要创建的索引时,请考虑查询频率和查询性能。
优化查询:尽可能使用简单的查询语句,并确保使用索引来过滤数据,以减少查询时间。
优化表结构:避免使用大型、不必要的列和表,以及尽可能使用小型数据类型。
使用存储过程和触发器:这些可以优化重复性操作的性能,并提高数据完整性。
使用分区分表:将表分为较小的分区可以提高查询性能,并减少查询时间。
避免使用 SELECT *:只选择需要的列可以减少查询时间和减轻数据库负载。
避免使用子查询:子查询可能会增加查询时间。如果可能,请使用联接操作。
避免使用临时表:创建和使用临时表可能会增加查询时间和占用更多的内存。
使用缓存:对于经常访问的查询结果,可以考虑使用缓存技术,如 redis。

使用主从复制:使用主从复制可以将查询负载分布到多个服务器上,并提高数据库的可伸缩性。
优化数据库设计:优化数据库设计可以提高查询性能和数据完整性,如使用正规化的表设计。
使用连接池:使用连接池可以避免频繁地创建和关闭数据库连接,从而提高数据库性能。
定期进行数据清理:定期清理不需要的数据和记录可以减少数据库的负载,并提高查询性能。

数据库调优

1)缓存大小参数

  • 缓冲池大小是Innodb存储引擎的核心参数之一,InnoDB 存储引擎缓存的数据和索引的大小,一般设置为物理内存的 60%-80%

2)线程池参数

  • 最大连接数(max_connections):允许同时连接到 MySQL 数据库的最大连接数,一般设置为 500-1000
  • 线程池大小(thread_pool_size):连接线程池的大小,一般设置为 CPU 核数的 2 倍
  • 等待连接超时时间(wait_timeout):等待连接的时间超过这个时间将会被强制断开

相关文章:

  • Linux(Centos7)安装 jenkins(jdk11+jenkins2.375),并配置JDK,Maven,Git,GitLab
  • CES 2024丨引领变革,美格智能为智能终端带来生成式AI能力
  • 【Electron】 Vite项目 初始配置 scss
  • 1.5计算机网络的分类
  • 【java八股文】之Java基础篇
  • AUTOSAR从入门到精通-Autosar 中断机制(七)
  • Nginx——日志自动切割
  • 语义分割数据集
  • OpenGauss源码分析-SQL引擎
  • 大模型LLM Agent在 Text2SQL 应用上的实践
  • Docker简介、基本概念和安装
  • GO自研微服务框架-中间件
  • SpringFramework实战指南(一)
  • day3-4 three.js学习笔记
  • 127.(leaflet篇)leaflet采集圆(移动端自己实现)
  •  D - 粉碎叛乱F - 其他起义
  • HTTP那些事
  • JavaWeb(学习笔记二)
  • js ES6 求数组的交集,并集,还有差集
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux快速复制或删除大量小文件
  • spring-boot List转Page
  • SQLServer之创建数据库快照
  • use Google search engine
  • Vue--数据传输
  • 编写符合Python风格的对象
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 小程序测试方案初探
  • 新版博客前端前瞻
  • 用 Swift 编写面向协议的视图
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ( 10 )MySQL中的外键
  • (2.2w字)前端单元测试之Jest详解篇
  • (HAL库版)freeRTOS移植STMF103
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)Linux——Linux常用指令
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (四) 虚拟摄像头vivi体验
  • (一) springboot详细介绍
  • (一)Java算法:二分查找
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • *Django中的Ajax 纯js的书写样式1
  • ./configure、make、make install 命令
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 反射的使用
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 使用反射注册事件
  • /proc/vmstat 详解