首页 > 数据库 >数据库问题排查以及SQL优化

数据库问题排查以及SQL优化

时间:2024-04-15 21:45:08浏览次数:36  
标签:索引 where 数据库 排查 SQL 优化 CPU

数据库CPU飙高

通过top等命令确定是否数据库进程CPU飙高

通过命令show processlist找出耗资源较大的SQL

如果没有特别耗资源的SQL,就查看session是不是突然增多,可以通过限制连接数

如果有特别耗资源的SQL,排查耗资源的SQL是否命中索引、是否表的数据量特别大

kill掉这个消耗大的线程,看看CPU使用率是否下降,调整这条SQL(优化),再手动执行来验证

 

慢SQL排查

打开慢查询日志开关,设置阈值(默认3s),查看日志,日志会记录慢SQL的语句和执行时间

 

SQL优化

先要找到需要优化的SQL,查看执行计划(explain),需要重点关注的字段有
type:system > const > eq_ref > ref > range > index > all, 正常情况下,最少要达到range
key:实际命中的索引
possible_keys:可能的索引
rows:估算的读取行数
extra:里面比较重要的有 using index需要回表),using index condition索引下推

1. 在合适的列上创建索引并能够命中索引,列的值足够离散、列的值不会经常更新、出现在where/order by/group by 后面的列
2. 建立联合索引,尽量实现覆盖索引和索引下推
3. 减少回表次数,比如深度分页的优化
4. 表连接不宜过多,尽量使用inner join代替left join,小表驱动大表
5. 避免使用union,改用union all(不去重)
6. 优先进行过滤, 比如where name like 'kevin%' group by name having age < 18 优化为 where name like 'kevin' and age < 18 group by name
7. 批量进行插入、更新和删除的操作,避免太大
7. 避免其他能让索引失效的情况
8. 尽量降低隔离级别为RC(严格来说不属于sql优化的范围)
9. 避免长事务(严格来说不属于sql优化的范围)

 

 

索引不生效的原因

组合索引不满足最左(前缀)匹配原则
以 % 开头的 LIKE 查询
select * (大概率)
在索引列上进行计算、函数、类型转换、隐式转换等操作
where条件使用or、使用is null、is not null
in的取值范围较大
表的数据量很小

 

标签:索引,where,数据库,排查,SQL,优化,CPU
From: https://www.cnblogs.com/huainanyin/p/18136327

相关文章

  • docker安装mysql8
    一、开始安装#新建挂载目录mkdir-p/opt/docker/mysql/datamkdir-p/opt/docker/mysql/confvim/opt/docker/mysql/conf/my.cnf[root@centos01mysql]#cdconf/[root@centos01conf]#lsmy.cnf[root@centos01conf]#catmy.cnf[client]default-character-set=utf8mb4[m......
  • MySQL 中 DELETE 语句中可以使用别名么?
    1情境deletefromtest1t1wherenotexists(select1fromtest2t2wheret1.id=t2.id);以上sql报错:ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtouse......
  • 向量数据库之Lancedb学习记录
    简介Lancedb是一个用于人工智能的开源矢量数据库,旨在存储、管理、查询和检索大规模多模式数据的嵌入。Lancedb的核心是用Rust编写的,并构建在Lance之上,专为高性能ML工作负载和快速随机访问而设计。快速开始安装pipinstalllancedb目前0.6.8需要pyarrow-12.0.0及以上,亲测15......
  • java连接ssmsSqlserver数据库 报错信息:com.microsoft.sqlserver.jdbc.SQLServerExce
    解决办法:将官网下载的驱动文件打开,找到如下路径,并复制,粘贴放到jdk的bin目录下......
  • PGSQL 问题解决
    1服务无法启动 这里更改安装目录bin下面例如E:\WorkingSoftware\PostgreSql\16\bin更改权限,下面都改下 2  安装时提示database出错,就初始化下执行以下命令E:\WorkingSoftware\PostgreSql\16\bin\pg_ctl.exe-DE:\WorkingSoftware\PostgreSql\16\dat......
  • 【知识点】常见的SQL优化手段
    问:有哪些常见的SQL优化手段?这也是个高频面试题,并且并非面试造火箭的那种问题,实际项目中也会有非常多的地方需要进行SQL优化避免使用Select*select*中,无用字段会增加网络带宽消耗,特别是varchar、blob、text等大字段select*无法使用Mysql优化器覆盖索引的优化。覆盖索......
  • 数据库和缓存如何保证一致性
    保证数据库和缓存之间的一致性是在许多应用程序中面临的挑战。数据库和缓存是两个不同的存储层,具有不同的特性和行为。在使用缓存的同时,确保数据库和缓存之间的数据一致性是至关重要的。 针对读请求,流程较简单,先读取缓存,缓存命中则返回结果,缓存未命中则读取数据库,并将读取的数......
  • Winodows安装Mysql 8.0.36 简单教程
    下载https://dev.mysql.com/downloads/mysql/选择下载简单版本即可安装1.解压将下载下来的安装包进行解压2.mysql初始化用cmd进入的mysql的解压包的bin目录里,执行初始化命令mysqld--initialize--console记录一下mysql初始化密码,备用。3.启动mysqlnetstartmy......
  • MySQL锁、事务和索引
    并发事务的控制方式是MVCC和行锁按范围分:表级锁、页锁、行级锁(锁一行或者多行)(记录索、间隙锁、临键锁(可重复读默认用这个做行锁,除非是主键和唯一索引会使用记录索))按功能分:读锁(S)、写锁(X)意向锁是表级锁,分为意向共享锁、意向排他锁,用于协调表锁和行锁的关系,事务想要在某些行上加共......
  • 一些有意思的sql
    createtemporarytabletmp_tableselect*,ROW_NUMBER()over(orderbydiff)asrank_numfrom(SELECT*,sum(num)over(orderbyoverdateROWSBETWEENUNBOUNDEDPRECEDINGANDCURRENTROW)-18ASdiffFROMmedical_goodsWHEREitem_id=7AN......