Mysql查询优化

MySQL-查询优化 对于刚入行的程序猿来说,如何优化MySQL查询,是必须跨过的坎。网上有很多关于SQL优化的博文,但大多是片段和结论。这里,我摘抄了《高性能MySQL》一书的内容,从全局的角度将MySQL查询优化的思路和要点进行串通,希望能帮助大家有一个系统性的认知。如果希望深入学习请阅读此书籍,并在实际开发中反复思考佐证。 一、MySQL基本架构 1、基本架构组成 Server层:包括连接器、查询缓存、... 阅读详情

                                       Mysql优化

##1:索引可以大幅度提高查询性能

1.1  缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:

a.有大量重复值、且经常有范围查询( > ,< ,> =,< =)和order by、group by发生的列,可考虑建立群集索引;

b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;

c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索引会导致系统低

效。用户在表中每加进一个索引,维护索引集合就要做相应的更新工作。

        1.2 用explain语句查询索引使用情况 


如何使用请查看文章:http://blog.youkuaiyun.com/yueguanghaidao/article/details/6933387  

索引注意事项:

a. 使用FULLTEXT参数可以设置索引为全文索引,全文索引只能创建在CHAR ,VARCHAR ,TEXT类型字段上。->>但只有MyISAM存储引擎支持全文索引。


b: 多列索引:在表的多列字段上建立一个索引,但只有在查询这些字段的第一个字段时,索引才会被使用。


c. 查询语句使用like关键字进行查询,如果匹配的第一个字符为”%“时,索引不会被使用

   

d. 查询语句中使用or关键字时,只有or前后两个条件的列都是索引时,查询时才使用索引


e.最好在相同类型的字段间进行比较,如不能将建有索引的int字段与bigint字段进行比较


如在一个DATE类型的字段上使用YEAE()函数时,将会使索引不能发挥应有的作用。所以,下面的两个查询虽然返回的结果一样,但后者要比前者快得多。

SELECT * FROM order WHERE YEAR(OrderDate)<2001;

SELECT * FROM order WHEREOrderDate<"2001-01-01";


f. 任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边


        因为在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描


如:SELECT * FROM inventory WHERE Amount/7<24;

SELECT * FROM inventory WHERE Amount<24*7;

上面的两个查询也是返回相同的结果,但后面的查询将比前面的一个快很多


SELECT * FROM RECORD WHERESUBSTRING(CARD_NO,1,4)=’5378’

应改为: SELECT *FROM RECORD WHERE CARD_NO LIKE ‘5378%’


g. 搜索字符型字段时,我们有时会使用LIKE 关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的

例如下面的查询将会比较表中的每一条记录。

SELECT * FROM books  WHERE name like "MySQL%"

但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:

SELECT * FROM books  WHERE name>="MySQL"andname<"MySQM";


h. 避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据。


例如:  SELECT id FROM employee WHERE id !="B%" 优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。



i.  能够用BETWEEN的就不要用IN,因为IN会使系统无法使用索引,而只能直接搜索表中的数据


 如:SELECT * FROM T1 WHERE ID IN(10,11,12,13,14)改成:SELECT *FROM T1 WHERE ID BETWEEN 10 AND 14



##2:在可能的情况下尽量限制尽量结果集行数


2.1:使用top

如:SELECT TOP 300COL1,COL2,COL3 FROM T


2.2:增加 limit 1 会让查询更加有效

      这样数据库引擎发现只有1后停止扫描,而不会去扫描整个表或索引


2.3:尽量避免slecect  * 命令,而是需要什么字段,查询什么字段


##3: 合理使用EXISTS,NOT EXISTS子句


如果想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用EXISTS代替。如:

IF (SELECT COUNT(*) FROM table_name WHEREcolumn_name = 'xxx')

可以写成:IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')



##4:数据类型


4.1:  只要能满足需求,应尽可能使用小的数据类型,

           比如能用tinyint 就不用int


4.2:  varchar比char节省空间,但效率比char低,想要获得效率就得牺牲一定空间。

如果一个varchar的列经常被修改,而且修改的数据长度不同,会引起‘行迁移’问题,造成多余I/O花费,这时最好用char代替varchar

如果是像身份证定长的字段,一定要用char ,查询时是全字段匹配,能获取更高效率。

这里考虑一个问题??  -》》使用varchar(5)和varchar(200)保存‘hello’占用的空间都是一样的,但是使用较短的列有巨大优势,因为较大的列会占用更多的
内存。


4.3:如果字段类型只有少量的几个,最好使用enum类型,因为enum类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多.

例如省份,性别等字段。


4.4:尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,这会降低查询和连接的性能,并会增加存储开销。

这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了


4.5:一般情况下日期和时间类型最好选择timestamp,因为datetime占用8字节存储空间,而timestamp占用4字节存储空间,明显更节约空间。


##5.在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。


##6.使用连接查询(join)代替子查询


因为子查询时,mysql需要为内层查询结果建立一个临时表,然后外层查询在临时表中查找,查询完后需要撤销临时表。

而连接查询不需要建立临时表,所以比子查询快。


 ##7. 使用联合 (union)来代替手动创建的临时表

MySQL 从 4.0 的版本开始支持UNION 查询,它可以把需要使用临时表的两条或更多的 SELECT 查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自

动删除,从而保证数据库整齐、高效。使用 UNION 来创建查询的时候,我们只需要用 UNION作为关键字把多个 SELECT 语句连接起来就可以了,要注意的是所有

SELECT语句中的字段数目要想同。下面的例子就演示了一个使用 UNION的查询。

select  name,phone from clinet  union  select name,bitthdate from author union slect name,supplier from product


##8. 充分利用连接条件


      在某种情况下,两个表之间不止一个连接条件,这时可在where子句中将连接条件完整写上,可大大提高查询速度。如:

SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD BWHERE A.CARD_NO = B.CARD_NO 

SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD BWHERE A.CARD_NO = B.CARD_NO AND A.ACCOUNT_NO=B.ACCOUNT_NO

第二句将比第一句执行快得多。


##9. 能用DISTINCT的就不用GROUP BY


  SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID 

   可改为:SELECT DISTINCT OrderID FROMDetails WHERE UnitPrice > 10

##10.尽量不要用SELECT INTO语句。 SELECTINTO 语句会导致表锁定,阻止其他用户访问该表


##11.UPDATE语句建议:

a. 尽量不要修改主键字段。

b. 当修改VARCHAR型字段时,尽量使用相同长度内容的值代替。

c. 尽量最小化对于含有UPDATE触发器的表的UPDATE操作。

d. 避免UPDATE将要复制到其他数据库的列。

e. 避免UPDATE建有很多索引的列。

f. 避免UPDATE在WHERE子句条件中的列。


openEuler 22.03 LTS SP4离线安装UKUI桌面全攻略(附依赖包下载) 本文提供openEuler 22.03 LTS SP4系统离线安装UKUI桌面环境的完整实战指南。针对无网络环境,详细解析了利用dnf工具下载依赖包、配置离线软件源、处理依赖冲突及安装后优化的全流程,并附带了关键依赖包资源,帮助运维人员高效完成图形化部署。 阅读详情

相关推荐

RTL8306MB交换芯片驱动开发避坑指南:从硬件接线到SDK移植全流程解析

本文详细解析了RTL8306MB交换芯片驱动开发的全流程,重点从硬件接线、SDK移植到实战调试。针对RMII模式下的常见问题,特别是TXEN与RXDV信号交叉连接等关键“坑点”,提供了清晰的排查指南和解决方案,旨在帮助嵌入式工程师高效完成网络设备开发。

277

MySQL讲义第18讲——使用explain命令查看与分析索引的使用情况

MySQL讲义第18讲——使用explain命令查看与分析索引的使用情况 在查询语句中使用 explain 关键字,可以查看索引是否正在被使用,有没有做全表扫描,并且输出使用的索引信息。 语法格式如下: explain select 语句; 一、数据准备 有一个 emp 表,表中的索引信息如下: mysql> show index from emp; +-------+------------+--------------+--------------+-------------+---------

睿思达DBA 2997

VCSA的vmware-updatemgr服务无法启动和vSAN界面报“certificate chain is not trusted and thumbprint doesn‘t match”处理

"Unable to update CM service info"和"Server certificate chain is not trusted and thumbprint doesn't match"问题处理

jetliu05的博客 1882

mysql in查询不要去重_MySQL 查询优化

使用索引规则全值匹配:查询的字段按照顺序在索引中都可以匹配到,最佳左前缀法则:指的过滤条件要使用索引必须按照索引建立时的顺序依次满足 , 一旦跳过某个字段 , 索引后面的字段都无法被使用。不在索引列上做计算:不在索引列上做任何操作(计算、函数、(自动 or 手动)类型转换「尤其注意 varchar 和 int」),会导致索引失效而转向全表扫描。索引列上不能有范围查询:将可能做范围查询的字段的索引顺...

weixin_42514777的博客 5361

【Unity】Unity 跨平台及编译过程

早期的Unity跨平台是基于MONO运行时的,又通过CLS实现了跨语言。其基本思路是将各个版本的语言统一编译成CIL语言,在不同平台运行时使用CLR进行解释。有点类似于Java的jdk和jvm。 CLS(Common Language System)通用语言规范:CLS是一种规范,类似于schema,当文件被指定遵守CLS规范后,在某语言中写出不符合通用规范的代码后将被警告或报错。 MONO是一个开源工程,其中包含C#编译器,CLR运行时,以及一组类库。该工程常见了一系列符合ECMA标准的.NET工具,MO

一个普普通通的游戏开发者 7235

Deepseek 10分钟化身理性荐股神器:触碰程序员不敢想的天花板

在这个消息疯狂、波动频繁的市场,“理性”两字显得弥足珍贵。通过Deepseek+AkShare+Aktools+Dify四位一体的方案,能帮我们降低信息搜集成本,并在短期投资领域搭建出一套“可解释、低门槛、易定制”的量化荐股流程。不要再盲目听小道消息或依赖情绪驱动,不妨给自己一个机会,让数据说话。而要注意的是,“理性荐股”并非万能,它只是工具,最终的收益还得依赖投资者自身对风险和机遇的权衡。祝大家都能在这股市里收获理性的底气,寻得更精准的入场时机。

qqxdh的博客 3751

MySQL 查询优化详解

MySQL 查询优化是提升数据库性能的关键,通过查询分析与执行计划(EXPLAIN),可以深入理解查询的执行过程,识别性能瓶颈。同时,虽然 MySQL 8.0 已移除查询缓存功能,但在早期版本中,查询缓存仍然是提升性能的一种方式。最后,使用 SQL 重写技巧,可以通过优化查询结构和减少资源消耗,显著提升查询效率。在实际应用中,优化查询不仅仅依赖于单一的技巧,而是需要结合数据库结构、索引设计、执行计划等多个因素进行综合考虑。通过持续的监控和优化,可以确保数据库在高负载情况下依然能够高效运行。

yimeixiaolangzai的博客 3592

第3版•系统集成项目管理工程师(中级) │ 告别迷茫!案例分析高分攻略

🥏第3版•系统集成项目管理工程师(中级) │ 告别迷茫!案例分析高分攻略

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3867

数据库系统原理与应用教程(038)—— MySQL 的索引(四):使用 EXPLAIN 命令分析索引

分析查询

睿思达DBA 1449

国产麒麟V10系统命令大全,100个实用命令助你玩转系统!

国产麒麟V10系统命令大全,100个实用命令助你玩转系统!

网络技术联盟站 1906

【异常】OpenClaw 上下文溢出问题(100% context used 309.9k/200k`)排查与解决

摘要:OpenClaw 运行出现"100% context used 309.9k/200k"报错,表示上下文窗口超出200k Token限制。解决方法包括:1) 重启服务或新建会话清空缓存;2) 修改配置文件提升context_window值;3) 长期优化如限制历史对话轮数、分批处理长文本。该问题通常由输入过长或多轮对话累积导致,需控制单次输入量在阈值内。

奶爸的编程之路,也就一周冷个三天 3236

【MySQL】查询优化

✓ 优化的目的是让资源发挥价值;✓ SQL和索引是调优的关键,往往可以起到“四两拨千斤”的效果。

迪曼奥特迦-博客 8995

Whisper 模型在嘈杂环境中的表现:降噪与增强技术

本报告系统分析了OpenAI Whisper模型在嘈杂环境中的表现机制,重点揭示其内在降噪能力的技术边界,并结合语音增强(SE)、时频分析等前沿技术提出优化方案。内容覆盖从基础概念(如噪声类型对ASR的影响)到理论框架(模型架构与数学形式化),再到实际应用(端到端部署策略)的全链路分析,同时通过案例研究与可视化工具(如梅尔频谱对比图)降低复杂概念的认知门槛。核心结论指出:Whisper的多语言预训练虽提升了泛化性,但在低信噪比(SNR<5dB)场景下需结合前端降噪或联合训练技术以突破性能瓶颈。

AI 原生应用开发的博客 488

MySQL 查询优化

在 MySQL 查询优化,我们要充分利用索引,让其发挥巨大作用;也要注意关联查询、排序查询、分组查询、子查询、分页查询、去重查询、以及 IN 和 EXISTS 关键字的使用。

格物致知,知行合一。 3198

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MySQL查询优化

从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等在完成这些任务的时候,查询需要在不同的地方花费时间,包括网络,CPU计算,生成统计信息和执行计划、锁等待(互斥等待)等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU操作和内存不足时导致的I/O操作上消耗时间。

代码是程序员的语言,博客是思想的桥梁,连接你我,共享智慧之光。 1251

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MySQL优化-查询优化

查询优化是数据库优化中的一个重要方面,可以提高查询的效率和响应速度,从而提升数据库系统的整体性能。以下是一些查询优化的总结:使用索引:索引可以加速查询的速度,因此需要在经常使用的字段上创建索引,避免在 where 子句中使用不等于避免在 where 子句中使用 or 操作符,避免在 where 子句中使用函数,避免在 where 子句中使用模糊查询。避免全表扫描:尽量避免使用不带条件的 select 语句,因为这会导致数据库执行全表扫描,而且会消耗大量的系统资源。

qq_51398439的博客 2686

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL查询优化之查询优化器

MySQL查询优化之查询优化器phpma.com  当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快。这一部分将介绍查询优化器是如何工作的。如果你想知道MySQL采用的优化手段,可以查看MySQL参考手册。phpma.com  当然,MySQL查询优化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查询,那么无论数据表

ethanzhao的专栏 3037

mysql慢查询优化

定位低效 SQL 执行慢有两种情况: 偶尔慢:DB 在刷新脏页 redo log 写满了 内存不够用,要从 LRU 链表中淘汰 MySQL 认为系统空闲的时候 MySQL 关闭时 一直慢的原因:索引没有设计好、SQL 语句没写好、MySQL 选错了索引 ’mysql慢查询优化 第一步:开启mysql慢查询日志,通过慢查询日志定位到执行较慢的SQL语句。 第二步:利用explain关键字可以模拟优化器执行SQL查询语句,来分析SQL查询语句。 第三步:通过查询的结果进行优化。 优化方式 (1)首先分

weixin_45615504的博客 7661

mysql查询优化_mysql查询优化之一:mysql查询优化常用方式

一、为什么查询速度会慢?一个查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中在“执行”阶段包含了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组。查询速度慢的原因在于:某些不必要的额外操作,某些操作被额外地重复很多次,某些操作执行得太慢。优化查询的目的就是减少和消除这些操作所花费的时间。二、慢查询基础:...

weixin_35079144的博客 298

mysql 不等于查询优化_MySQL调优之查询优化

实际工作中,有时候打开一个页面响应时间非常慢,这背后通常牵涉到SQL语句查询慢的问题。前面我们提到很多数据库结构设计,建索引等来视图提高MySQL的性能。但是如果我们实际业务场景中,SQL查询语句写的不合适,索引建的再好可能也达不到预期的高性能。因此,我们很有必要对查询进行分析,我写的查询为什么慢,该怎么样对查询进行优化。查询慢的原因一般情况下,查询可以看成按如下顺序执行任务:由客户端向...

weixin_39977136的博客 1227

mysql 不等于查询优化_MySql查询优化常用方式

一、为什么查询速度会慢? 一个查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中在“执行”阶段包含了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组。 查询速度慢的原因在于:某些不必要的额外操作,某些操作被额外地重复很多次,某些操作执行得太慢。 优化查询的目的就是减少和消除这些操作所花费的时间。二、慢查询...

weixin_39890629的博客 827

mysql 优化子查询_MySQL子查询的优化

本文基于MySQL5.7.19测试创建四张表,pt1、pt2表加上主键mysql> create table t1 (a1 int, b1 int);mysql> create table t2 (a2 int, b2 int);mysql> create table pt1 (a1 int, b1 int, primary key (a1));mysql> create ...

weixin_31632707的博客 970

如何优化MySQL查询?

降低响应时间,减少返回行数,减少扫描行数。

松生的博客 1996

mysql关联查询和查询优化

mysql关联查询 参考:https://blog.youkuaiyun.com/lu0422/article/details/78892497 mysql查询慢的原因 记录慢查询日志 分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和经历,可以使用pt-query-digest工具进行分析 使用show profile set profileing = 1;开启,服务器上执行所有...

qinAction的博客 2403

【MySQL】查询性能优化

用户自定义变量是一个用来存储内容的临时容器,在连接MySQL的整个过程中都存在可以使用下面的SET和SELECT语句来定义他们正在上传…重新上传取消。

weixin_45912201的博客 2236
上一篇: Java线程安全和非线程安全
下一篇: 子查询性能优化
OnePiece_Sky
博客等级 码龄15年 9粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值