MySQL性能优化之常用SQL语句优化

上一篇 <<<MySQL性能优化之表设计优化
下一篇 >>>MySQL性能优化之索引调优实战


SQL性能优化的目标:至少要达到range级别,要求是ref级别,consts最高。【阿里巴巴JAVA开发手册】

说明:
1)、consts单表中最多只有一个匹配行(主键/唯一索引),在优化阶段即可读到数据。
2)、ref指的是使用普通的索引(normal index)。
3)、range 对索引进行范围检索
反例:explain表的结果,type=index,索引物理文件全扫描,速度非常慢,这个index级别比较range还低,与全表扫描是小巫见大巫。
最优到最差顺序:system > const > eq_ref > ref > range > index > ALL

语句优化

1.简单查询语句优化

1.1 select 字段部分

  • a、返回具体的字段以代替*

1)、用不到的字段会消耗CPU和IO、消耗网络带宽
2)、若可以使用索引的情况下,使用*会导致回表查询,效率更低
3)、数据暴露更不安全。

  • b、count(*)会统计null值的行,count(列名)不会统计null值的行
select count(user_id) from dw_user where `order` is null limit 10; 结果:5875
select count(0) from dw_user where `order` is null limit 10; 结果:5875
select count(`order`) from dw_user where `order` is null limit 10;  结果:0

5.6版本:默认会选择辅助索引技术,没有的话才会走主键聚集索引技术
1.select count(1) from employees; 使用辅助联合索引计数
2.select count(id) from employees; 使用辅助索引技术
3.select count(name) from employees; 使用辅助索引技术
4.select count() from employees; 使用辅助索引技术
5.select count(id) from employees force index(PRIMARY) 强制使用主键索引
从效率角度分析:count(1) ==count(
)>count(name)>count(id)
因为主键索引的id对应的叶子节点中存放data数据,每个节点只能放16k的页数据,所以扫描范围不是非常广,而且比较占内存的耗时。
count(name)统计的时候,叶子节点中存放主键id,每次扫描范围更广,效率更高。
推荐使用count(*)

在MySQL 5.7 COUNT(*)默认会选择聚集索引技术,进行一次内部handler函数调用,即可快速获得该表总数。
如果聚集索引较大(或者说表数据量较大),没有完全加载到buffer pool中的话,MySQL 5.7的查询方式有可能反而会更慢,还不如用原先的方式(MySQL 5.6)

聚集索引:就是主键id索引
非聚集索引:就是自定义的其他字段索引

  • c、函数统计,尽量放到内存中执行
select sum(a)+sum(b) as c
  • d、tinyint在使用时容易变为布尔型,代码中记得转换,用case时等于更优
case status when 0 then do1 when 1 do2 end
===》
case when status=0 then do1 when status=1 then do2 end

1.2 条件部分

  • a、数据类型必须一致,否则索引失效,还会增加转换的开销
SELECT * FROM t WHERE id = '19';
----->
SELECT * FROM t WHERE id = 19;
  • b、少用≥,直接使用>,可提升查询效率
select * from dw_user where user_id>=101; ----—多一次等于的判断 
select * from dw_user where user_id>100;

1.3 分组和排序

  • 禁止使用order by rand()
SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;
---->
SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4; 
  • 分组查询时,默认分组后,还会排序,可能会降低速度
在group by 后面增加 order by null 就可以防止排序. 
explain select * from emp  group by deptno order by null; 

排序细节可参考order by中的单路和双路排序算法原理

1.4 索引不起效果的写法

  • a、使用group by、not in、not like不使用索引

2.查询语句-临时表场景

2.1 必须创建临时表的情况

  • 如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;
  • 如果数据量不大,为了缓和系统表的资源,应先 create table,然后 insert。

2.2 临时表的显示删除

先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

3.插入语句

//批量插入使用/*+append*/ 
insert into p_nbsc_ho1 select * from p_nbsc_ho (消耗时间73分钟)
insert /*+append*/ into p_nbsc_ho2 select * from p_nbsc_ho (消耗时间7分钟) 

4.更新语句

如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。

5.开发代码中少用truncate table

truncate table和delete功能相同,但速度更快,使用的系统和事务日志资源较少,它无事务且不触发trigger,容易造成事故。【阿里巴巴JAVA开发手册】


推荐阅读:
<<<MySQL执行计划示例解读
<<<MySQL性能优化之慢查询定位
<<<MySQL性能优化之表设计优化
<<<MySQL性能优化之索引调优实战
<<<MySQL性能优化之分页查询优化
<<<MySQL性能优化之关联查询优化
<<<MySQL性能优化之in、exists优化
<<<order by中的单路和双路排序算法原理
<<<MySQL如何性能优化面试题完美解答

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容