数据库01-慢查询优化

news2024/11/17 22:05:48

目录

MySQL优化

慢查询

如何定位慢查询?

如何分析慢查询?


MySQL优化

MySQL 优化是数据库管理和应用性能调优的一个重要方面。以下是一些常规性的 MySQL 优化经验和适用场景:

  1. 索引优化

    • 确保表的字段上有适当的索引,以加速查询。

    • 使用覆盖索引,以减少对表的实际访问次数。

    • 避免在列上使用通配符前缀,因为它会阻止使用索引。

  2. 查询优化

    • 尽量避免使用 SELECT *,只选择实际需要的列。

    • 使用合适的 WHERE 子句,以减少检索的行数。

    • 避免在查询中使用 SELECT DISTINCT,除非确实需要。

  3. 表设计优化

    • 使用适当的数据类型,避免使用过大的数据类型,以减小存储和提高检索效率。

    • 规范化数据库,以减少冗余数据,提高数据的一致性。

    • 使用分区表,将大表分割成更小的逻辑部分,加速查询。

  4. 缓存优化

    • 使用缓存,例如 MySQL Query Cache 或者外部缓存,减少对数据库的实际查询。

    • 使用合适的缓存策略,例如最近最少使用 (LRU) 策略。

  5. 配置调整

    • 调整 MySQL 的配置参数,包括缓冲池大小、连接数等,以适应你的应用需求。

    • 定期检查和优化表,使用 OPTIMIZE TABLE 命令。

  6. 分表分库

    • 当表变得非常大时,考虑将其分割成更小的表,甚至分散到不同的数据库中。

    • 使用分库分表可以提高查询性能和负载均衡。

  7. 合理使用事务

    • 使用合适的事务隔离级别,避免不必要的锁定和阻塞。

    • 考虑将一些读操作放在只读事务中,以提高并发性能。

  8. 定期备份和优化

    • 定期备份数据库,以防止数据丢失。

    • 定期执行 ANALYZE TABLECHECK TABLE,以修复可能存在的表问题。

  9. 监控和分析

    • 使用 MySQL 的性能监控工具,例如 Performance Schema 和 slow query log,以识别慢查询和性能问题。

    • 使用工具分析数据库的瓶颈,并采取相应的优化措施。

  10. 合理使用缓存

    • 对于读密集型应用,可以考虑使用缓存来存储频繁读取的数据,减轻数据库的压力。

慢查询

实际项目中,关于SQL优化的问题最常见的场景就是慢查询了。

慢查询的内部原因可以大致归纳为以下几个方面:

  • 聚合查询(优化子查询)

  • 多表查询(优化表数据结构设计)

  • 数据量过大(使用临时表)

  • 深度分页查询(优化分页设计方案)

慢查询的表象:

  • 页面加载过慢

  • 接口压测响应时间过长(超过1s)

  • 链路监控告警(sql执行时间超过2s)

如何定位慢查询?
  1. 开源工具

    • 调试工具:Arthas

    • 运维工具:Prometheus、Skywalking(公司内部可能会通过整合开源工具实现自定义的链路监控工具)

  2. Mysql自带慢查询日志

    在 MySQL 的配置文件中(通常是 my.cnfmy.ini),确保慢查询日志已经启用。配置如下:

    slow_query_log = 1
    slow_query_log_file = /path/to/slow-query.log
    long_query_time = 2 # 将查询时间的阈值设置为适当的值,单位是秒

    开启慢查询日志配置会影响MySQL性能,所以用于调试阶段,不会在生产环境配置。

  3. 使用 MySQL Workbench

    MySQL Workbench 提供了一个 Performance Dashboard,可以帮助你分析和诊断慢查询。在 MySQL Workbench 中,选择 "Performance",然后选择 "Dashboard"。你可以查看慢查询日志,并使用工具提供的图形化界面进行分析。

如何分析慢查询?

根据工具和日志我们可以得到慢SQL语句,那么如何分析呢?

1.拿来即用的EXPLAIN,分析执行计划

对于复杂的慢查询,你可以查看执行计划以了解 MySQL 是如何执行查询的。可以使用 EXPLAIN 关键字来获取查询计划。使用方式:explain + 慢查询语句。

explain select * from tb_hotel;

EXPLAIN SELECT * FROM tb_hotel WHERE id = "38609";

  • type 查看sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、 index、all (一般允许到range,如果是index和all就必然要优化了) system:查询系统中的表 const:根据主键查询 eq_ref:主键索引查询或唯一索引查询 ref:索引查询 range:范围查询 index:索引树扫描 all:全盘扫描

  • possible_keys、key、key_len确认语句中命中的索引是否存在失效的情况

  • Extra额外的优化建议,如果是“using index condition”,有优化索引的空间

2.检查索引

确保查询中使用的字段上有适当的索引。使用 SHOW INDEX FROM your_table 查看表的索引情况,确保索引被正确使用。

3.使用第三方查询优化工具

如 MySQL Workbench、Navicat 等,提供了可视化的查询分析功能,能够帮助你更直观地了解查询的性能特征。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计选题推荐-农产品销售微信小程序/安卓APP-项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

C语言全部关键字解析

前言 C语言具有以下关键字: 这些关键字如下: 关键字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile 对于这些关键字,大…

牛客网刷题笔记131111 Python实现LRU+二叉树先中后序打印+SQL并列排序

从学校步入职场一年多,已经很久没刷过题了,为后续稍微做些提前的准备,还是重新开始刷刷题。 从未做过计划表,这回倒是做了个计划表,希望能坚持吧。 刷题比较随性且量级不大,今天就写了2个算法2个sql&#x…

第四节(2):修改WORD中表格数据的方案

《VBA信息获取与处理》教程(10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网…

Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法——使用布局、Spacer等控件

Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法—使用布局、Spacer等控件 Chapter1 Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法—使用布局、Spacer等控件Chapter2 Qt Creator中布局器详解01. 概述02. 开发环境03. 布局器概述04. 布局属性设置05. 弹簧条属性…

简单版本管理服务编写

说明: 制作android应用内更新的时候,经常会用到版本检查,下载,安装,这时候需要写一个版本管理服务。 本文说明了自己编写版本服务的简单经过。 解决方案: 该软件实现如下功能: 创建后台接口:版本软件上传…

基于PHP的设云尘资讯网站设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

保姆级自定义GPTs教程,无需任何代码!

11月10日,OpenAI正式宣布向所有ChatGPT Plus用户开放GPTs功能,一个人人都能开发自定义ChatGPT助手的时代降临。 GPTs支持无代码、可视化点击操作,这意味着即便你没有任何编程经验,只要有数据、脑洞大开的想法,就能开发…

探索微信小程序框架的精华——高质量的优秀选择

目录 引言: 1. 框架性能 2. 开发者工具支持 3. 文档和社区支持 4. 扩展能力 5. 使用率和稳定性 结语: 引言: 微信小程序作为一种轻量级、高效便捷的应用形式,已经在移动应用领域占据了重要地位。而其中,选择一个…

PostMan授权认证使用

Authorization 对于很多应用,出于安全考虑我们的接口并不希望对外公开。这个时候就需要使用授权(Authorization)机制。 授权过程验证您是否具有访问服务器所需数据的权限。 当发送请求时,通常必须包含参数,以确保请求具有访问和返回所需数据…

C/C++数据结构之链表题目答案与解析

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.题目…

C++学习笔记(二):C++是如何运行的

C是如何运行的 include 预处理语句&#xff0c;在编译前就会被处理。 main函数 程序入口。 #include <iostream>int main() {std::cout << "Hello World!" << std::endl;std::cin.get();return 0; }Visual Studio 解决方案平台指的是编译的代码的…

从零开始开发抖音小程序:与餐饮团购的完美融合

本文将探讨如何从零开始开发一个创新的抖音小程序&#xff0c;以其独特的特性与餐饮团购进行完美融合。 一、什么是抖音小程序&#xff1f; 抖音小程序为开发者提供了在用户观看视频时进行无缝体验的机会。通过借助抖音的庞大用户基础&#xff0c;开发者可以将自己的创意呈现给…

python3GUI--QQ音乐By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;展示0.播放页1.主界面1.精选2.有声电台3.排行4.歌手5.歌单 2.推荐3.视频1.视频2.分类3.视频分类 4.雷达5.我喜欢1.歌曲2.歌手 6.本地&下载7.最近播放8.歌单1.一般歌单2.自建歌单3.排行榜 9.其他1.搜索词推荐2.搜索结果 三&#x…

Vuex持久化插件

Vuex数据默认是存储在内存中的&#xff0c;当然我们也可以将它存储在Local Storage&#xff0c;也可以指定某些数据存储在Local Storage 这样我们就用到了Vuex持久化插件vuex-persistedstate 安装vuex-persistedstate插件 npm install vuex-persistedstate --save 案列&#x…

数据管理系统-week1-文件系统、数据库和数据库管理系统

文章目录 前言一、 文件系统文件系统的限制 二、 数据库系统三、 数据库管理系统参考文献 前言 一、 文件系统 对于更高级的数据处理应用程序来说&#xff0c;基于数据块的持久存储逻辑模型过于简单数据块序列被划分为称为文件的数据块的可变子序列&#xff0c;与文件相关的名…

【ATTCK】MITRE Caldera -引导规划器

一、Caldera 概念 在详细介绍新的引导式规划器之前&#xff0c;我们先回顾一下与 Caldera 相关的概念的一些定义。 能力是 Caldera 可以执行的最小原子动作。对手由一组能力组成。例如&#xff0c;旨在发现和泄露感兴趣的文件的对手可能具有发现文件、创建暂存目录、将发现的文…

养老院信息展示预约小程序的效果如何

老龄化速度加快及快节奏时代&#xff0c;银发群体的老年生活&#xff0c;儿女往往难以照顾&#xff0c;养老院成为不少家庭或个人的选择&#xff0c;靠谱机构往往能带给老人丰富多彩的生活。 而在高需求的同时&#xff0c;无论对需求者还是养老院本身都存在一定难题&#xff1…

【Mysql】next-key 锁范围

背景 Mysql RR场景下通过next-key 锁解决了幻读的问题&#xff0c;而幻读通常是由 insert 新增的数据导致。所以next-key锁最终通过锁机制防止了一定条件下的新增数据从而解决了幻读问题。 规律 next-key锁可以由以下几条规律总结出锁范围 next-key会对查询过程中访问到的对…