sql 优化笔记(不全的,暂时存盘,不建议看,关闭留言,想喷也喷不了)
sql 执行计划:
explain
type 索引类型性能对比(越左越高):
system > const > eq_ref > ref > range > index > all
ref:
非唯一性索引,对于每个索引键的查询麻烦回匹配的所有行(0行或多行)
range:
检索指定范围的行,where后是范围查询(between,>,<,>=,<=),但in有时会失效。
index:
查询全部索引中的数据
all:
查询全部表中的数据
system 和 const :
结果只有一条数据的时候
eq_ref:
结果多条,但是每一条都是唯一的
ref:
结果是多条,每条数据是0或多条
Extra:
using filesort:性能消耗大,需要一个额外的查询
对于单索引,排序查找是同一个字段,不会出现using filesort
复合索引不要夸列,遵循最佳左前缀原则。
where哪些字段就orderby那些字段
sql编写过程:select dinstinct ... from...join...on...where...group by ... having...order by ..limit
sql解析过程:from ... on ...join ... where...group by...having...select...dinstinct..order by...
exist和in 子查询
主表数据大使用in
子表数据大使用exist
用法:
select ...from table where exist/in (子查询)
提高order by
1.调整buffer容量大小 max_length_for_sort_data
2.避免select * ...
3.复合索引 不要跨列 ,避免using filesort
4.保证全部排序字段排序的一致性,都是升序或降序
sql慢查询日志:
检查是否开启:show variables like '%slow_query_log%'
临时开启:set global slow_query_log = 1
永久开启:
my.cnf中
[mysqld]下加上
slow_query_log = 1
slow_query_log_file = 输出日志地址
慢阀值查询:show variables like '%log_query_time%'
临时设置:set global log_query_time = 值
永久设置:
my.cnf中
[mysqld]下加上
log_query_time = 值
create table tablelock(
id int(5) primary key not null auto_increment,
name varchar(20) not null
)engine myisam;
insert into tablelock(name) values("s1");
insert into tablelock(name) values("s2");
insert into tablelock(name) values("s3");
insert into tablelock(name) values("s4");
insert into tablelock(name) values("s5");
加锁:
lock table 表1 read/write , 表2 read/write , .....
释放锁:
unlock tables;
查看锁:
show open tables;
myisam:
在执行查询语句之前指定给表加读锁,在更新(增删改)操作时会自动给表加写锁
加读锁:
lock table tablelock read ;
1.会话0给A表加锁:
其他会话操作:可对其他表进行读写操作。对A表可以读,写需要等待释放锁
2.当前会话给A表加读锁,则当前会话只能对A表进行读操作
加写锁:
lock table tablelock write ;
1.当前会话:当前会话能对当前表能进行任何操作(增删改查 ),但不能操作其他表。
2.其他会话:当加锁的会话释放锁后才能对该表操作
分析表锁定:
查看锁
show opend tables; 1代表加锁,0代表未加锁
分析表锁定的严重程度:
show status like 'table%';
Table_lock_immediate:可能获取到的锁
Table_lock_waited:需要等待的锁,该值越大,说明该数据锁
竞争越大
建议:Table_lock_immediate/Table_lock_waited > 50000 ,建议采用Innodb,否则使用Myisam
Innodb:
MySQL会自动commit,建议在研究学习是将其关闭:
set autocommit=0;
行锁:
create table linelock(
id int(5) primary key not null auto_increment,
name varchar(20) not null
)engine Innodb;
insert into linelock(name) values("s1");
insert into linelock(name) values("s2");
insert into linelock(name) values("s3");
insert into linelock(name) values("s4");
insert into linelock(name) values("s5");
会话x对数据a进行增删改操作,其他会话必须等待会话x结束事务(commit/rollback)后才能对数据进行操作。
表锁通过unlock tables或事务(commit,rollback)解锁,行锁通过事务进行解锁。
行锁一次锁一行数据,不同数据互不干扰。
行锁注意事项:
1.如果没有索引,则行锁转成表锁
间隙锁:
表中存在id为1,2,3,4,7,8,9 则4,5就是间隙,MySQL会自动给间隙的数据加上锁,此锁称为间隙锁
分析行锁:
show status like '%innodb_row_lock%'
Innodb_row_lock_current_waits:当前正在等待的锁数量
Innodb_row_lock_time:总等待时长,系统启动到现在共等待的时间
Innodb_row_lock_time_avg:平均等待时长,系统启动到现在平均等待的时间
Innodb_row_lock_time_max:最长等待时间,系统启动到现在最长等待时间
Innodb_row_lock_time_waits:等待次数,系统启动到现在等待次数
在查询语句上加锁,只需要在sql后面加for update:
select * from 表 where .. for update;
sql 优化笔记(不全的,暂时存盘,不建议看,关闭留言,想喷也喷不了)相关推荐
- SQL优化笔记分享:34条实用经验可别错过
SQL 优化经验 1. 选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving ta ...
- SQL优化笔记(二)—CPU优化
概览: 数据库性能问题故障排除 检查硬件原因 使用 PerfMon 跟踪数据库瓶颈 评估查询性能 解决数据库系统的性能问题可能是一项艰巨的任务.了解如何找到问题很重要,但是了解系统对特定请求作出特定反 ...
- 【2022黑马程序员】SQL优化
[黑马程序员]SQL优化笔记 文章目录 [黑马程序员]SQL优化笔记 插入数据优化 大批量插入数据 总结 主键优化 数据组织方式 页分裂 A. 主键顺序插入效果 B. 主键乱序插入效果 页合并 索引设 ...
- 管好统计信息,开启SQL优化之门
遇到执行效率低下的SQL语句,对于DBA而言无疑是家常便饭了,但如何快速优化,把它变成小菜一碟,则得看看咱们DBA+社群联合发起人卢飞的经验之谈了. 专家简介 卢飞 DBA+社群联合发起人 Oracl ...
- mysql sql优化_浅谈mysql中sql优化
说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...
- MySQL数据库基础到进阶笔记整理包含事务、SQL优化、锁等内容
写在前面 本文是在学习MySQL数据库时整理的笔记,可供初学者学习 是在https://dhc.pythonanywhere.com/entry/share/?key=12e4a7324f68371d ...
- 笔记12 SQL优化
笔记12 性能与SQL优化 1.性能优化 复习一下什么是性能: DB/SQL 优化是业务系统性能优化的核心 2.关系数据库 MySQL 什么是关系数据库 数据库设计范式 常见关系数据库 SQL 语言 ...
- oracle 动态sql列转行_SQL优化笔记分享:34条实用经验可别错过!
SQL 优化经验 1. 选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving tab ...
- 学习笔记之-MySql高级之sql优化
一 Mysql简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. M/SQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据 ...
最新文章
- 在Ubuntu 16.04.6 LTS上升级python 3.5到3.7.3实录
- routersploit 路由器漏洞检测及利用框架
- Git使用汇总之工作区、暂存区、版本库
- 关于 STM32G0/G4/L4 HAL_IIC HAL_I2C_Mem_Read 函数读取M24C64存储芯片遇到的问题
- linux nameserver导致的故障
- Vmware中安装Ubuntu的步骤
- BMP位图之8位位图(三)
- python大数据工程师 培训_大数据工程师学习之路
- 内核移植出现:Kernel panic - not syncing: No init found.
- 计算球的体积(信息学奥赛一本通-T1030)
- java基础—自定义一个比较器,按照字符串的长度升序的方法来比较字符串进行储存(java集合三)
- 【算法】剑指 Offer 42. 连续子数组的最大和 【重刷】
- 移动端ios和安卓input问题
- AWS 开战 MongoDB!
- 打开Excle出现配置进度解决方法
- 神经网络预测模型基本原理与编程实现
- 微信开发者工具调试公众号网页
- 你会卖掉自己的网上信息吗?大数据可能根本不属于你
- w7计算机文件夹打开怎么设置密码,怎样设置文件夹密码 Win7系统文件夹加密步骤详解...
- trimmed ICP及其在PCL代码解析与使用