sql性能优化精华总结

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: sql性能优化精华总结explain在性能分析上有很大的作用id:包含一组数字,表示查询中执行select子句或操作表的顺序,id相同,执行顺序由上至下,id越大优先级越高,越先被执行select_type: 常见几个simple:表示简单的select,没有union和子查询primary:有...

sql性能优化精华总结
explain在性能分析上有很大的作用

id:包含一组数字,表示查询中执行select子句或操作表的顺序,id相同,执行顺序由上至下,id越大优先级越高,越先被执行
select_type: 常见几个
simple:表示简单的select,没有union和子查询
primary:有子查询,最外面的select查询就是primary
union:union中的第二个或随后的select查询,不依赖外部查询结果
dependent union:union中的第二个或随后的select查询,依赖外部查询结果
table: 当前表名
type: system(表仅有一行(=系统表),这是const连接类型的一个特例),const(常量查询),ref(非唯一索引访问,只有普通索引),eq_ref(主键或唯一索引),range(索引的范围查询),index(根据索引查询全表),all(全表扫描,通常没有建索引的列)
效率:system>const>eq_ref>ref>range>index>all
possible_keys: 表中可能帮助查询的索引
key: 选择使用的索引
key_len: 使用的索引长度(在不损失精度的情况下越短越好)
rows: 扫描的行数,越大越不好
filtered: 表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数
extra: 了解几个
using temporary:组合查询返回的数据量太大需要建立临时表存储数据,出现这个sql应该优化
using where:使用where查询条件
using index:使用覆盖索引,不需要回表查询
using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”,使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化
如果知道查询结果只有一条,那么sql语句中使用limit 1会提高查询效率,避免全表扫描
避免在复杂查询里使用like ‘%parm%’,以%开头的模糊查询都会导致索引失效,而’param’和’param%'还是会使用索引
如果不是业务必须,建议使用union all代替union,因为union需要进行排重,效率低。对于一些单纯使用分表来提高效率的查询,完全可以使用union all
尽量用join代替子查询,虽然join性能并不佳,但和mysql子查询比起来还是有非常大的性能优势,因为连接查询不需要建立临时表,其速度比子查询快
尽量避免使用!=或<>操作符,引擎将放弃使用索引而进行全表扫描,可以考虑改为范围查询解决
尽量避免使用or来连接条件,引擎将放弃使用索引而进行全表扫描,如可使用(or查询现在的mysql版本好像也走索引)
select id from table1 where name='zhangsan'
union all
select id from table1 where name='lisi'

替代

select id from table1 where name='zhangsan' or name='lisi'

尽量避免使用in和not in,引擎将放弃使用索引而进行全表扫描,对于连续数值,能用between就不要使用in(in查询现在的mysql版本好像也走索引)
尽量避免使用select *查询
区分in和exist
select * from table1 where id in (select id from table2)

等价于

select from table1 where exists(select from table2 where table2.id=table1.id)

exists以外表为驱动,先被访问,in以内表为驱动。exists适合外表小而内表大,in适合外表大而内表小
在in和exists通用的情况下使用exists,因为in不走索引

用where字句替换HAVING字句,因为having只会检索出所有记录之后才对结果集进行过滤
尽量不要有空判断的语句,这将导致全表扫描而不是索引扫描,一般为经常null判断的列增加默认值
索引列上有函数处理,将导致不走索引
隐式转换导致不走索引
mysql组合索引遵循“最左前缀”的原则,组合索引中第一列必须出现在查询条件中,组合索引才有效
尽量使用数字型字段,尽可能使用varchar/nvarchar代替char/nchar,这样节省存储空间,提升检索效率。
根据需要建立多列联合索引
根据业务场景建立覆盖索引只查询业务需要的字段
多表连接字段上需要建立索引
where条件字段上需要建立索引
排序字段建立索引

分组字段建立索引

作者:shuangyueliao
来源:CSDN
原文:https://blog.csdn.net/shuangyueliao/article/details/89512894
版权声明:本文为博主原创文章,转载请附上博文链接!

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL XML 前端开发
sql 性能优化基于explain调优(二)
sql 性能优化基于explain调优(二)
11 0
|
1月前
|
SQL 关系型数据库 MySQL
干货!SQL性能优化,书写高质量SQL语句
干货!SQL性能优化,书写高质量SQL语句
31 2
|
3月前
|
存储 SQL 分布式计算
性能优化:Spark SQL中的谓词下推和列式存储
性能优化:Spark SQL中的谓词下推和列式存储
|
3月前
|
SQL 缓存 数据库
PL/SQL的性能优化
PL/SQL的性能优化
37 0
|
4月前
|
SQL 存储 关系型数据库
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
90 0
|
6月前
|
SQL 分布式计算 大数据
分享一个 HIVE SQL 性能优化点-使用公共表表达式 CTE 替换临时表
分享一个 HIVE SQL 性能优化点-使用公共表表达式 CTE 替换临时表
|
8月前
|
SQL 关系型数据库 MySQL
MySQL的SQL语句性能优化
MySQL的SQL语句性能优化
|
9月前
|
SQL 存储 缓存
52条SQL语句性能优化策略
通过对网上资料的整理,归纳了52条SQL语句性能优化策略
79 0
|
SQL 存储 缓存
老司机总结的12条 SQL 优化方案(非常实用)(一)
老司机总结的12条 SQL 优化方案(非常实用)
老司机总结的12条 SQL 优化方案(非常实用)(一)
|
存储 SQL 缓存
MySQL性能优化(硬件,系统配置,表结构,SQL语句)
MySQL性能优化(硬件,系统配置,表结构,SQL语句)
131 0
MySQL性能优化(硬件,系统配置,表结构,SQL语句)