文档章节

mysql 查询优化技巧

之渊
 之渊
发布于 2018/01/23 11:44
字数 1058
阅读 24
收藏 1

查询使用索引相关

1, 避免在 sql 的 where 条件中使用 函数,会导致索引失效

2, join 两个表时,如果关联字段数据类型不一致,请使用类型转换函数。

3, sql 中的条件值必须与字段类型一致, 避免数据库做隐式类型转换,导致索引失效 (数据类型禁止加引号,字符串必须加引号).

4, 避免使用 左模糊 ( like '%xxx' ), 全模糊查询。 尽量 使用 右模糊查询,可以走索引。

5, join , in , not in , exists , not exists 性能比较

A, 字段上有索引: exists(好) -- in 差-- join 最差

B, 字段上无索引 : join 好 -- exists 差 -- in 最差

C, 字段上有索引 : left join 好--- not exists 差 -- not in 最差

D, 字段上无索引 : not in 好 --- not exists 差 -- left join 最差

6, 尽量不要使用 反向查询, 例如 not in , != , not like 它们不走索引

7, 尽量不要or , 不走索引 , 如果可以用 in 代替, in 元素个数要严格控制, 防止 超额,建议 最大不超过 200

8, 日期字段查询统一使用 这种格式的字符串 "yyyy-MM-dd HH:mm:ss" ; mysql 的日期类型与字符类型相同的,不需要做额外的类型转换。 比如 select id where time >='2010-01-10 01:10:20'

9, 避免多于排序:使用 group by 时,数据库默认是会进行排序操作的,如果 不需要,可以使用 group by NULL 避免数据库排序(提升查询效率和 减少资源开销) select id form user group by name order by NULL ;

  1. 业务程序禁止使用 存储过程, 触发器,函数,作业和视图等, 一些特殊日期, 聚合等函数除外。

11, 尽量使用 join 连接查询 代替子查询

12, 所有内连接, 需将 关联表统一写到 from 子句中,关联条件和过滤条件统一写到 where 子句中

13, 外连接都用 left join ,不用 right join

  1. 多表连接的分页语句,如果 过滤条件在单个表上, 需要先分页再 join 连接 比如 : select a.name ,b.id from ( select id,name from user where id>100 order by id limit 0,10 ) a inner join shop b where a.id = b.id;

  2. 在 iBatis 中,尽量不要使用 $name$ , 应该采用 #name# 防止sql注入

  3. inser into 语句也必须指定具体字段名称。 禁止写成 insert into user values(...)

  4. SQL 中 尽量避免出现 now() , rand() , sysdate() , current_user() 等不确定结果的函数

  5. 禁止用 select for update 语法

其他知识

1, insert ignore into 当 插入 数据时,如出现错误,重复数据, 将不返回错误,只以经过形式返回。所以使用 ignore 请确保语句本身没有问题,否则也会被忽略掉 比如:

insert ignore into books(name) valuse ('xxx');


2, on duplicate key update 当 primary 或者 unique 重复时, 则执行 update 语句,在原有记录基础上,更新指定字段内容, 其他字段内容保留,如果 update 后为无用语句,如id =id ,错误不会被忽略,为了实现 name 重复的数据插入不报错,可使用 下语句:

insert into books(name) values 'xxx' 
on duplicate key update id=id ;

3, insert ... select ... where not exist 根据 select 的条件判断是否插入, 可以不光通过 primary 和 unique来判断, 也可以通过其他条件

insert into books(name) 
select id  from dual where 
not exists (select id from books where id=1)

4, replace into 如果存在 primary or unique 相同的记录, 则先删除再插入新的记录。 如果记录有多个字段,在插入的时候如果有的字段 没有赋值,那么新插入的记录字段为空

replace into books select 1 from books
  1. 大表一般用distinct效率不高,大数据量的时候都禁止用distinct,建议用group by解决重复问题。

以上 来自 书籍 BAT 公司员工的MYSQL 修为

© 著作权归作者所有

之渊
粉丝 14
博文 649
码字总数 200420
作品 0
佛山
程序员
私信 提问
SQL 常用优化手段总结 - 小技巧

中国有句古话叫做:欲速则不达。在一口气学完了分析 SQL 语句的一般步骤与索引的正确运用方式后小憩片刻。搭配上红茶与白兰地轻松享用下面这些小技巧吧! 系列文章回顾 SQL 常用优化手段总结...

给你添麻烦了
2018/01/10
0
0
数据库技巧——MySQL十大优化技巧

作者:杰之蓝 WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是一个大问题。希望本文能对大家掌握MySQL优化技巧有所帮助。 1.优化你的MySQL查询缓存 在MySQL服务器上进行查...

Yisen
2011/03/22
274
2
101个MySQL调试和优化技巧

101个MySQL调试和优化技巧 MySQL是一个功能强大的开源数据库。随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限。这里是101条调节和优化MySQL安装的技巧。一些技巧是...

开元中国2015
2015/05/19
28
0
MySQL实战技巧-1:Join的使用技巧和优化

join用于多表中字段之间的联系,在数据库的DML (数据操作语言,即各种增删改查操作)中有着重要的作用。 合理使用Join语句优化SQL有利于: 增加数据库的处理效率,减少响应时间; 减少数据库...

登高且赋
2018/01/29
0
0
关于MySQL的知识点与面试常见问题都在这里

摘要: Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide 书籍推荐 《高性能MySQL : 第3版》 文字教程推荐 MySQL ...

传授知识的天使
2018/06/13
57
0

没有更多内容

加载失败,请刷新页面

加载更多

Activity启动模式二

上篇文章Activity启动模式一主要介绍了Activity的四种启动模式,这些启动模式都是在AndroidManifest中进行配置的。除此之外,Android系统还通过Intent类提供了一些标志位,同样可以指定Activ...

ltlovezh
20分钟前
4
0
三原色还原

1、Color Filter Array — CFA 随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式...

天王盖地虎626
31分钟前
3
0
kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
今天
8
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部