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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 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

新手教程


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
5 1
|
1天前
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
|
4天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万数据量的优化实录
【10月更文挑战第6天】 在现代互联网应用中,随着用户量的增加和业务逻辑的复杂化,数据量级迅速增长,这对后端数据库系统提出了严峻的挑战。尤其是当数据量达到百万级别时,传统的数据库解决方案往往会遇到性能瓶颈。本文将分享一次使用MySQL与Redis协同优化大规模数据统计的实战经验。
22 3
|
4天前
|
NoSQL 关系型数据库 BI
记录一次MySQL+Redis实现优化百万数据统计的方式
【10月更文挑战第13天】 在处理百万级数据的统计时,传统的单体数据库往往力不从心,这时结合使用MySQL和Redis可以显著提升性能。以下是一次实际优化案例的详细记录。
21 1
|
2天前
|
监控 关系型数据库 MySQL
mysql8索引优化
综上所述,深入理解和有效实施这些索引优化策略,是解锁MySQL 8.0数据库高性能查询的关键。
9 0
|
1月前
|
关系型数据库 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)")
|
3月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
85 13
|
3月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
3月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
56 6
|
2月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
324 0