Mysql常用SQL查询语句优化方法

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 当系统的吞吐量变大后,数据读写速度会变得原来越慢,因此要想办法对SQL语句进行优化。

当系统的吞吐量变大后,数据读写速度会变得原来越慢,因此要想办法对SQL语句进行优化。

避免引擎放弃使用索引而进行全表扫描:

1、对查询进行优化,首先应考虑在 where 及 order by 涉及的列上建立索引

2、应尽量避免在 where 子句中使用!=或<>操作符

3、应尽量避免在 where 子句中对字段进行 null 值判断,如:

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0


4、尽量避免在 where 子句中使用 or 来连接条件,

例如:

select id from t where num=10 or num=20

可以使用全联查询:

select id from t where num=10

union all

select id from t where num=20


5、like不能前置百分号:

前置百分号将不会使用索引,,但是业务上不可避免可能又需要使用到这种形式。

例如:

select id from t where name like ‘%c%’

若要提高效率,可以使用locate函数或者position函数代替like查询:

可以改为locate(‘c’,name ) > 0或POSITION(‘c’ IN name )>0


6、对于连续的数值,能用 between 就不要用 in

例如:

select id from t where num in(1,2,3)

可以使用下面格式:

select id from t where num between 1 and 3


7、在子查询中,表大用exists,表小用in,等表谁都行。


8、应尽量避免在 where 子句中对字段进行表达式操作

例如:

select id from t where num/2=100

应改为:

select id from t where num=100*2


9、应尽量避免在where子句中对字段进行函数操作

例如:

select id from t where substring(name,1,3)=’abc’–name以abc开头的id

select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id

应改为:

select id from t where name like ‘abc%’

select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′


10、不要在where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。


文 末 彩 蛋 : \color{#FF0000}{文末彩蛋:}文末彩蛋:

来自大牛的灵魂拷问:MySQL有什么好优化的?阿里的标准已经说得很清楚了,mysql做好索引就行,不要三表关联,同时控制嵌套子查询的层级不大于二。其他按照阿里的规范来,精力放到前端去处理,横向的扩展前端应用及后端分库。研究这些mysql非索引类的优化是方向性的错误。


有些业务真的复杂,不关联的话,得分批次查询,当查大量数据的时候就得大批量执行sql语句,效率会很低,关联后只需要一次或几次就行,效率会高很多,像这种怎么解决?

复杂业务用oracle,不要用mysql。如果你用mysql处理复杂业务,就必须具备很强的前端应用分布式的能力和后端mysql横向拆分的能力,然而这样的扩展规模受限,因此现在还在这中间插入,增加了中台的概念,把分布式能力加持在中台上,然后由中台向前端去提供服务。总的来说超大规模的业务要省钱省力应该用oracle,花钱买oracle来简化整个架构。

但是如果依然满足不了性能要求,则只能转向前面说的三层架构,那投入的人力物力将是极其巨大的,一般大企业负担不起的。也正因为此,阿里这样的云服务就来廉价的提供现成的弹性云和基础架构来满足业务快速膨胀的企业。对中台这样的三层架构来说,后端集群中的单个数据库并不承担性能上的主要压力,集群中的各个数据库也不需要保持强一致性。整个体系的能力体现在分布式规划上。因此研究mysql单库的性能是方向性的错误,一来不需要掌握这样的技能,二来mysql先天就不适合oltp应用(联机事务处理)。精力应该放在mysql集群方案,拆分方案,异构数据的转换方案上来。


出处:


按照年龄的升序进行排序,如果年龄相同再按照英语成绩降序排列

select name from stus order by age,english desc;

查询 stus 表中 name 以猪开头的且名字长度为3的学生信息

select * from stus where name like ‘猪__’;

A,B两个集合,比如A有3条记录,B有6条,A和B交叉有2条数据

select * from stus,grade;查的是笛卡尔积:18条数据

内连接还有一种隐式的写法,即不需要显示的指定 INNER JOIN 关键字,使用隐式内连接条件的关键字要使用 where 而不再是 on

select grade_name, name from grade,stus where stus.gradeId = grade.id;

left join 是 left outer join 的简写,A left join B等于:3+2=5

right join 是 right outer join 的简写,A right join B等于:2+6=8

新手教程


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
1月前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
134 3
|
4月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
6月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
144 13
|
6月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
6月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
79 6
|
6月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
497 1
|
6月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
450 3