SQL:优化问题&并发问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: SQL:优化问题&并发问题

@[toc]

二 SQL优化

1)SQL优化之分页优化

普通写法

select * from buyer where sellerid=100 limit 100000, 5000

普通limit M,N 的翻页写法,在越往后翻页的过程中,速度越慢,原因mysql会读取表中的前M+N条数据,M越大,性能就越差

优化写法

select t1.* from buyer t1,
       (select id from buyer where sellerid = 100 limit 100000,5000) t2
where  t1.id = t2.id

注意:需要在t表的sellerid字段上创建索引,id为表的主键

create index ind_sellerid on buyer(sellerid);

原始语句与优化后语句的查询时间对比

-- 原始语句: 
select id,... from buyer where sellerId=765922982 and gmt_modified >='1970-01-01 08:00:00 and gmt_modified<='2013-06-05 17:11:31 limit 255000,5000; 
-- 优化后语句: 
select t2.* from (select id from buyer where sellerId= 765922982 and gmt_modified >='1970-01-01 08:00:00 and gmt_modified <='2013-06-05 17:11:31 limit 255000,5000)t1 buyer t2 where t1.id=t2.id 
-- 查询时间:60S→0.2S

2)SQL优化之子查询优化

典型子查询

select first_name
from employees
where emp_no in
(select emp_no from salaries_2000 
where salary = 5000);

MySQL的处理逻辑是遍历employees表中的每一条记录,代入到子查询中去

改写子查询

select first_name
from employees emp,
(select emp_no from salaries_2000 
where salary = 5000) sal
where emp.emp_no = sal.emp_no;

SQL优化最佳实践

  1. 分页优化

采用高效的Limit写法,避免分页查询给数据库带来性能影响

  1. 子查询优化

子查询在5.1,5.5版本中都存在较大的风险,将子查询改为关联
使用MySQL5.6的版本,可以避免麻烦的子查询改写

  1. 查询需要的字段

避免用select * 查询所有字段数据,只查询需要的字段数据

三 锁

1)索之表级锁

Innodb 与 Myisam

引擎 支持事务 并发 索引损坏 锁级别 在线备份
Myisam 不支持 查询堵塞更新 索引损坏 不支持
Innodb 支持 不堵塞 不损坏 支持

目前比较推荐Innodb,较高版本也将其设置 为默认引擎

典型案例

创建表,引擎为Myisam

create table 't_myisam'(
'id' int(11) default null
)engine=myisam default charset=utf8;

查询堵塞更新

select id,sleep(100) from t_myisam
 
Query 6 User sleep select id ,sleep(50) from t
Query 4 Waiting for table metadata lock alter table t add column gmt_create data
Query 1 Waiting for table metadata lock select*from twhere id=2
Query 1 Waiting for table metadata lock update t setid_2where.id=1

解决:更改引擎

alter table t_myisam engine = innodb;

2)锁之Metadata lock

DDL操作

alter table t add column gmt_create datetime

数据库连接状态

select id , sleep(50) from t 
-- 在操作下面DDL语句之前,先执行查询状态的语句
alter table t add column gmt_create datetime

可以看到出现:Waiting for table metadata lock,导致后面所有操作都出现堵塞,因为DDL语句会破坏元数据结构,导致拿不到锁。
Tips:DDL过程中注意数据库中大长事务,大查询

锁问题最佳实践

  1. 设计开发阶段

    1. 避免使用myisam存储引擎,改用Innodb引擎
    2. 避免大事务,长事务导致事务在数据库中的运行时间加长
    3. 选择升级到MySQL5.6版本,支持online ddl
  2. 管理运维阶段

    1. 在业务低峰期执行上述操作,比如创建索引,添加字段;
    2. 在结构变更前,观察数据库中是否存在长SQL,大事务;
    3. 结构变更期间,监控数据库的线程状态是否存在lock wait;
    4. 阿里云ApsaraDB支持在DDL变更中加入 wait timeout;
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之如果oss文件过大,如何在不调整oss源文件大小的情况下优化查询sql
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
13天前
|
SQL 关系型数据库 MySQL
SQL优化方法有哪些?
【6月更文挑战第16天】SQL优化方法有哪些?
220 5
|
9天前
|
SQL 存储 关系型数据库
不懂索引,简历上都不敢写自己熟悉SQL优化
大家好,我是考哥。今天给大家带来MySQL索引相关核心知识。对MySQL索引的理解甚至比你掌握还重要,索引是优化SQL的前提和基础,我们一步步来先打好地基。当MySQL表数据量不大时,缺少索引对查询性能的影响都不会太大,可能都是0.0几秒;但当表数据量逐日递增时,建立一个合适且优雅的索引就至关重要了。
798 1
不懂索引,简历上都不敢写自己熟悉SQL优化
|
12天前
|
SQL 数据库 索引
在SQL中如何实现多用户并发控制?
【6月更文挑战第17天】在SQL中如何实现多用户并发控制?
14 2
|
13天前
|
SQL 数据处理 数据库
如何进行SQL查询优化?
【6月更文挑战第16天】如何进行SQL查询优化?
363 3
|
20天前
|
SQL 缓存 监控
sql anywhere 数据库优化
SQL Anywhere数据库优化涉及索引、查询、配置、硬件、维护和应用程序多方面。关键策略包括:确保索引有效且定期优化,使用EXPLAIN计划优化查询,调整数据库缓存设置,升级硬件,定期备份,优化SQL语句并减少数据库访问。实时监控性能并据此调优,但需依据具体应用场景和版本进行适配测试。
|
1天前
|
SQL 存储 数据库
sql优化提速整理
sql优化提速整理
|
22天前
|
存储 SQL 关系型数据库
MySQL数据库——SQL优化(1/3)-介绍、插入数据、主键优化
MySQL数据库——SQL优化(1/3)-介绍、插入数据、主键优化
236 1
|
3天前
|
SQL 存储 关系型数据库
Mysql-事务-锁-索引-sql优化-隔离级别
Mysql-事务-锁-索引-sql优化-隔离级别
|
1月前
|
SQL 监控 数据库
sql anywhere 数据库优化
\ Anywhere\对于任何数据库系统,优化都是持续的过程,旨在提高查询性能、减少资源消耗并确保数据的完整性和安全性。以下是一些建议,帮助您优化 SQL Anywhere 数据库: 1. **
58 5