MySQL下优化SQL语句的一些经验

大一Python之循环解决实际问题 pythin之循环解决实际问题 阅读详情
自从今年10月1日正式版上线以来,YMU website monitoring系统的客户数量增加很快,最近系统速度有点慢了,赶紧做一下系统优化吧。主要从前端和后台这两方面做了优化,现在速度快多了,哈哈!

后台方面主要对SQL语句和数据存储进行了优化,感觉自己成了小半个DBA了,记录一下MySQL下SQL语句优化的一些技巧和经验。

一些小技巧

1. 如何查出效率低的语句?
在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句。你也可以在启动配置文件中修改long query的时间,如:
# Set long query time to 8 seconds
long_query_time=8
2. 如何查询某表的索引?
可使用SHOW INDEX语句,如:
SHOW INDEX FROM [表名]
3. 如何查询某条语句的索引使用情况?
可用EXPLAIN语句来看一下某条SELECT语句的索引使用情况。如果是UPDATE或DELETE语句,需要先转换为SELECT语句。
4. 如何把导出INNODB引擎的内容到错误日志文件中?
我们可以使用SHOW INNODB STATUS命令来查看INNODB引擎的很多有用的信息,如当前进程、事务、外键错误、死锁问题和其它一些统计数据。如何让该信息能记录在日志文件中 呢?只要使用如下语句创建innodb_monitor表,MySQL就会每15秒钟把该系统写入到错误日志文件中:
CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;
如果你不再需要导出到错误日志文件,只要删除该表即可:
DROP TABLE innodb_monitor;
5. 如何定期删除庞大的日志文件?
只要在启动配置文件中设置日志过期时间即可:
expire_logs_days=10

经验教训

1. 重点关注索引

下面以表TSK_TASK表为例说明SQL语句优化过程。TSK_TASK表用于保存系统监测任务,相关字段及索引如下:
  • ID:主键;
  • MON_TIME:监测时间;建了索引;
  • STATUS_ID:任务状态;与SYS_HIER_INFO.ID建立了外键关系。

注MySQL自动会为外键建立索引,在本次优化过程中,发现这些自动建立的外键索引会对SQL语句的效率产生不必要的干扰,需要特别注意!


首先,我们在日志文件中查到下面语句的执行比较慢,超过10秒了:
# Query_time: 18 Lock_time: 0 Rows_sent: 295 Rows_examined: 88143
select * from TSK_TASK WHERE STATUS_ID = 1064 and MON_TIME >= '2007-11-22' and MON_TIME < '2007-11-23';

哦,原来在88143条记录中要查出符合条件的295条记录,那当然慢了。赶紧用EXPLAIN语句看一下索引使用情况吧:
+----+-------------+----------+------+----------------------------------------------------------+------------------------------------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+----------------------------------------------------------+------------------------------------+---------+-------+--------+-------------+
| 1 | SIMPLE | TSK_TASK | ref | FK_task_status_id_TO_SYS_HIER_INFO,TSK_TASK_KEY_MON_TIME | FK_task_status_id_TO_SYS_HIER_INFO | 9 | const | 276168 | Using where |
+----+-------------+----------+------+----------------------------------------------------------+------------------------------------+---------+-------+--------+-------------+

可以看出,有两个索引可用FK_task_status_id_TO_SYS_HIER_INFO,TSK_TASK_KEY_MON_TIME,而最终执行语句时采用了STATUS_ID上的外键索引。

再看一下TSK_TASK表的索引情况吧:
+----------+------------------------------------+-------------+-------------+
| Table | Key_name | Column_name | Cardinality |
+----------+------------+------------------------------------+--------------+
| TSK_TASK | PRIMARY | ID | 999149 |
| TSK_TASK | FK_task_status_id_TO_SYS_HIER_INFO | STATUS_ID | 16 |
| TSK_TASK | TSK_TASK_KEY_MON_TIME | MON_TIME | 13502 |
+----------+------------------------------------+-------------+-----------+--

在Oracle或其他关系数据库下,WHERE条件中的字段顺序对索引的选择起着很重要的作用。我们调整一下字段顺序,把STATUS_ID放在后面,再EXPLAIN一下:
EXPLAIN select * from TSK_TASK WHERE MON_TIME >= '2007-11-22' and MON_TIME < '2007-11-23' and STATUS_ID = 1064;

但是没什么效果,MySQL还是选用系统建立的STATUS_ID外键索引。

仔细分析一下,看来Cardinality属性(即索引中的唯一值的个数)对索引的选择起了极其重要的作用,MySQL选择了索引值唯一值个数小的那个索引作为整条语句的索引。

针对这条语句,如果使用FK_task_status_id_TO_SYS_HIER_INFO做索引,而TSK_TASK表中存放很多天数据的话,那扫描的记录数会很多,速度较慢。可以有以下几个优化方案:
  • 如果一天的任务数不多的话,我们删除索引FK_task_status_id_TO_SYS_HIER_INFO,那MySQL会使用索引TSK_TASK_KEY_MON_TIME,然后在该天的数据中在扫描STATUS_ID为1064的记录,那速度也不慢;
  • 如果一天的任务数多的话,我们需删除索引FK_task_status_id_TO_SYS_HIER_INFO和TSK_TASK_KEY_MON_TIME,然后再建立STATUS_ID,MON_TIME的联合索引,这样效率肯定会很高。

因此建议,对那些记录数多的表,建议不要使用外键,以避免造成性能效率的严重降低。

2. 尽量控制每张表的记录数

当一张表的记录数很大时,管理和维护就会很麻烦,如索引维护就会占用很长时间,从而会给系统的正常运行造成很大的干扰。

对随时间推移数据量不断增长的表,我们可以根据时间来区分实时数据和历史数据,可以使用后台服务程序定期移动实时表中的数据到历史表中,从而控制实时表的 记录数,提高查询和操作效率。但注意每次移动的时间要足够短,不要影响正常程序的数据写入。如果占用时间太长,可能会造成死锁问题。

3. 数据散列(partition)策略

当客户数达到一定规模后,单个数据库将无法支撑更高的并发访问,此时可以考虑把客户数据散列(partition)到多个数据库中,以分担负载,提高系统的整体性能与效率。

数据散列可以考虑采用federeated或sharded方式,网上有不少这方面的资料。 YMU目前正在考虑做数据散列,等以后有实际经验后,再写文章介绍吧。

(3dnr)多帧视频图像去噪 (一) 视频图像去噪主要利用相邻帧间内容相似性,通过时域帧平均降低随机噪声。为避免运动物体产生"拖尾"现象,可采用运动自适应或运动补偿时域滤波方法。前者根据运动强度动态调整滤波系数,后者通过运动补偿使参考帧更接近当前帧。运动补偿方法虽能更好处理运动区域,但计算复杂度高且对快速运动场景效果有限。相比之下,运动自适应方法在实时视频处理中更具优势,能平衡去噪效果与硬件资源消耗。两种方法可根据场景动态切换以获得最佳去噪效果。 阅读详情

相关推荐

小爱音箱Play增强版刷机接入大模型:自定义唤醒词与远程控制全攻略

智能音箱作为家庭语音入口,受限于厂商预设技能,难以满足个性化需求。通过串口刷机与Linux系统分区改造,可以完全掌控设备底层,将豆包、通义千问等大模型API接入原有音频链路,实现真正智能的语音问答。自定义唤醒词打破了“小爱同学”的唯一唤醒方式,结合ESP32-S3外挂模块,还能优化远场拾音。更深入的应用在于将音箱打造为家庭中控,通过大模型工具调用解析自然语言指令,实现远程控制电脑、智能灯等设备。本文从设备选型、拆机串口、系统备份到语音链路搭建,完整梳理了小爱音箱Play增强版的改造路径,适合具备动手能力的开

weixin_30036289的博客 747

面试八股之MySQL篇3.3——SQL优化经验篇—— SQL语句优化

🔥本篇概览:详细讲解了SQL语句优化

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1000

AI人工智能与模拟退火:碰撞出的智慧火花

本文旨在为读者全面介绍模拟退火算法在人工智能领域的应用。我们将涵盖从基础理论到实际实现的完整知识体系,帮助读者理解这一受自然界启发的优化技术如何解决复杂的计算问题。文章首先介绍模拟退火的基本概念,然后深入其工作原理和数学基础,接着通过Python实现展示具体应用,最后讨论实际应用场景和未来发展方向。模拟退火(Simulated Annealing, SA):一种受物理退火过程启发的概率性优化算法能量函数(Energy Function):评估系统状态的函数,对应优化问题的目标函数。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 453

MySQL数据库及sql语句性能优化的经验分享

在进行性能分析前,需要先定位耗时查询。 MySQL提供了内建的耗时查询日志。使用前,打开my.cnf文件,将slow_query_log设置为"On"。 同时将long_query_time设置为一个对一次查询来说比较慢的时间(秒数),比如0.2。slow_query_log_file设置为你想保存日志文件的路径。然后运行代码,执行时间超过设定上限的查询将会被记录到日志中。 1. ...

你是我的天晴 886

WSL2 Ubuntu 22.04安装NVIDIA驱动避坑指南:从驱动版本选择到CUDA环境验证

本文详细介绍了在WSL2 Ubuntu 22.04中安装NVIDIA驱动和配置CUDA环境的完整流程,包括驱动版本选择、环境变量设置以及常见问题解决方案。通过本指南,用户可以避免常见的安装陷阱,确保GPU加速环境正确配置,适用于深度学习开发和CUDA编程。

weixin_28419039的博客 464

[QMT量化交易小白入门]-105、震荡市最适合的策略:ETF多标的动态网格策略,回测年化收益47.81%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 2069

mysql的分析sql语句命令_如何使用mysql的Explain命令优化SQL语句-百度经验

8、其他说明possible_keys:列指出MySQL能使用哪个索引在该表中找到行key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULLkey_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好ref:显示使用哪个列或常数与key一起从表中选择行。rows:显示MySQL认为它执行查询时必须检...

weixin_39681644的博客 77

已解决“TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败“,亲测有效!!!

已解决"TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败",亲测有效!!!

wbajsjhhhhh的博客 1万+

Mysql 数据库优化(五)sql语句优化【个人经验】转

网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免...

aaa8822的博客 195

面向非平行语料的语音转换技术综述

摘要语音转换是语音及人工智能领域的一项研究课题,其目标是在保持源语音内容不变的情况下改变语音的音色,使其听上去像是由另一个目标说话人说出的,同时还需保证语音的质量和自然度。面向非平行语料的语音转换技术是当下的热门研究内容,其使用非平行的多说话人语音数据集进行模型训练,能完成多对多以及任意对任意的语音转换。对近年来面向非平行语料的语音转换进行了全面的总结和分析。首先概述了早期面向平行语料的语音转换及其缺陷,然后对当下面向非平行语料的语音转换的各类实现方法进行介绍和对比分析,最后对语音转换技术进行了总结和展望。

qq_61890005的博客 831

某易将军令口令纯算法还原py篇

算法开源,将军令口令算法。希望官方多多更新吧

任雪飘的博客 3913

MySQL 数据库 SQL 语句深度解析与实战全攻略

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考。

yishuihanliang的博客 541

【2026年华为暑期实习(AI)-4月8日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

答案与解析 1. 相关系数问题 答案:C. 完全负线性相关 解析:相关系数ρ=-1表示X和Y之间存在完全负线性相关关系,所有数据点都严格落在一条斜率为负的直线上。 2. 矩阵秩问题 答案:B. Σ的对角线上非零奇异值的个数 解析:矩阵A的秩等于其奇异值矩阵Σ中非零奇异值的个数,因为U和V都是正交矩阵,不改变矩阵的秩。 3. 条件概率问题 答案:B. 0.5 解析:根据全概率公式和贝叶斯公式计算,P(B)=0.5×0.4+0.3×0.6=0.38,P(A|B)=(0.5×0.4)/0.38≈0.526,最接近

m0_73659489的博客 287

【MySQL面试复习】谈一谈你对SQL的优化经验

一般会从这几方面进行考虑,比如建表的时候、使用索引、sql语句的编写、主从复制、读写分离,还有一个如果量比较大的话,可以考虑分库分表

m0_60511809的博客 1537

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

mysql语句优化

一.执行计划 可参考这篇博客:https://blog.youkuaiyun.com/wuseyukui/article/details/71512793 二.索引类型 主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。 唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 普通索引:Normal建立在单列或多列上,用于加快查询速度,一张表可建立多个普通索引。...

软件小虫的博客 353

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL优化技巧

MySQL优化三大方向① 优化MySQL所在服务器内核(此优化一般由运维人员完成)。② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行参数调整。③ 对SQL语句以及表优化。MySQL参数优化1:MySQL 默认的最大连接数为 100,可以在 mysql 客户端使用以下命令查看mysql> show variables like 'max_connections';2:查看

8万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL 数据库 SQL 语句全面解析与实战总结

在《MySQL 数据库技术》课程中,SQL 语句是核心知识体系。本文从语法规范、应用场景、易错点及实战案例四个维度,对 MySQL 常用 SQL 语句进行系统性整理,结合官方文档(参考 MySQL 8.0 官方文档 )和实战经验,帮助读者构建完整的 SQL 知识框架。目录前言一、数据定义语言(DDL)1. CREATE 语句​2. ALTER 语句​二、数据操作语言(DML)1.INSERT 语句2.UPDATE 语句三、数据查询语言(DQL)1. SELECT 语句2. 聚合函数。

2501_91809383的博客 2196

mysql水平分表后sql语句该怎么写_如何去写一手好SQL ?

点击上方“方志朋”,选择“设为星标”回复”666“获取新整理的面试资料作者 | 编码砖家链接 | cnblogs.com/xiaoyangjia/p/11267191.html目录MySQL性能最大数据量最大并发数查询耗时0.5秒实施原则数据表设计数据类型避免空值text类型索引优化索引分类优化原则SQL优化分批处理不做列运算避免Select *操作符<>优化OR优化IN优化...

weixin_39812224的博客 183

浅谈mysql配置优化和sql语句优化 - 王伟 - 51CTO技术博客

做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气。有承担错误的勇气,就有去做事得勇气。无论做什么事,只要是对的,就要去做,勇敢去做。出了错误,承担错误,改正错误,这样的人没有人会去责怪。     很久之前就想写一篇关于mysql优化方面的文章了,忙于工作,在着也比较懒散。现在网上mysql优化方面的帖子很多,也不乏精品。很早听一DBA

远方雪的专栏 1866

mysql查找多条慢sql语句_mysql查找执行效率慢的SQL语句

一些小技巧1. 如何查出效率低的语句?在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句。你也可以在启动配置文件中修改long query的时间,如:# Set long query time to 8 secondslong_query_time=82. 如何查询某...

weixin_42134285的博客 312

浅谈mysql配置优化和sql语句优化

做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气。有承担错误的勇气,就有去做事得勇气。无论做什么事,只要是对的,就要去做,勇敢去做。出了错误,承担错误,改正错误,这样的人没有人会去责怪。     很久之前就想写一篇关于mysql优化方面的文章了,忙于工作,在着也比较懒散。现在网上mysql优化方面的帖子很多,也不乏精品。很早听一DBA

zgp3297299的专栏 527

Mysql篇(三):SQL优化经验全方位解析

通过SQL编写、建表设计、索引使用到日常维护的优化,可全面提升数据库性能。实际项目中需结合业务场景,灵活运用优化策略,不断调试以达最佳效果。

Chenchen0905_的博客 1295

mysql查询优化的20条经验

MySQL性能优化的20条经验 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下

Lankecms 871
上一篇: MySQL下优化SQL语句的一些经验
下一篇: 一个MySQL死锁问题的分析及解决
java_veteran
博客等级 码龄19年 2粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值