MySQL进阶SQL优化
MySQL进阶SQL优化
查询效率分析:
- 子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。在这种情况下可以考虑用联接查询来取代。
- 如果要用子查询,那就用EXISTS替代IN、用NOT EXISTS替代NOT IN。因为EXISTS引入的子查询只是测试是否存在符合子查询中指定条件的行,效率较高。无论在哪种情况下,NOT IN都是最低效的。因为它对子查询中的表执行了一个全表遍历。
- 建立合理的索引,避免扫描多余数据,避免表扫描!
几百万条数据,照样几十毫秒完成查询.
SQL提高查询效率
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=03.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=205.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 36.下面的查询也将导致全表扫描:
select id from t where name like ‘%abc%’
若要提高效率,可以考虑全文检索。7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*29.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where datediff(day,createdate,’2005-11-30’)=0–‘2005-11-30’生成的id
应改为:
select id from t where name like ‘abc%’
select id from t where createdate>=’2005-11-30’ and createdate<’2005-12-1’9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
11.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)12.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
13.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
14.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
15.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
16.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
优化铁律
1、避免将字段设为“允许为空”
2、数据表设计要规范
3、深入分析数据操作所要对数据库进行的操作
4、尽量不要使用临时表
5、多多使用事务
6、尽量不要使用游标
7、避免死锁
8、要注意读写锁的使用
9、不要打开大的数据集
10、不要使用服务器端游标
11、在程序编码时使用大数据量的数据库
12、不要给“性别”列创建索引
13、注意超时问题
14、不要使用Select *
15、在细节表中插入纪录时,不要在主表执行Select MAX(ID)
16、尽量不要使用TEXT数据类型
17、使用参数查询
18、不要使用Insert导入大批的数据
19、学会分析查询
20、使用参照完整性
21、用INNER JOIN 和LEFT JOIN代替Where
原文地址https://blog.csdn.net/lwl2014100338/article/details/81271160
MySQL进阶SQL优化相关推荐
- MySQL进阶 | SQL优化 | 按关键字分类及原理 | 无知的我费曼笔记(图文排版无水印)
无知的我正在复习MySQL进阶知识.... 笔记特点是 我重新整理了涉及资料的一些语言描述.排版,而使用了自己比较容易理解的描述.同样是回答了一些常见关键问题 如果有遇到有任何无法进展问题或者疑惑的地 ...
- MySQL零基础从入门到精通(进阶SQL优化篇)
MySQL零基础从入门到精通(进阶SQL优化篇) SQL优化 insert 如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化. insert into tb_test value ...
- MySQL之SQL优化详解(二)
目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...
- MySQL 常用SQL优化
MySQL 常用SQL优化 MySQL 常用SQL优化: 一.大批量插入数据: 1.对于load MyISAM存储引擎的表,可以通过关闭打开MyISAM表非唯一索引的更新来提升导入速度: 例:my ...
- 【MySQL】MySQL数据库SQL优化工具 SQL Tuning Expert for MySQL(收费)
1.概述 SQL Tuning Expert for MySQL 是 Tosska 公司推出的针对MySQL的SQL优化工具. 该工具不仅让DBA或者SQL开发人员,轻松阅读和理解执行计划,而且能产生 ...
- Mysql的sql优化方法
Mysql的sql优化方法 1.选择最合适的字段属性 Mysql是一种关系型数据库,可以很好地支持大数据量的存储,但是一般来说,数据库中的表越小,在它上面执行的查询也就越快.因此,在创建表的时候,为了 ...
- 深入学习MySQL、SQL优化、集群搭建
个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 日拱一卒,不期速成,厚积薄发 序号 内容 1 Java基础面试题 2 JVM面试题 3 ...
- mysql sql 1到10_(1.10)SQL优化——mysql 常见SQL优化
(1.10)常用SQL优化 insert优化.order by 优化 1.insert 优化 2.order by 优化 [2.1]mysql排序方式: (1)索引扫描排序:通过有序索引扫描直接返回有 ...
- mysql sql优化_浅谈mysql中sql优化
说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...
最新文章
- python flask 上传文件到服务器
- linux shell参数传递、获取方式
- OpenSSL原理与实现
- 《Reids 设计与实现》第十三章 Sentinel
- community 计算模块度_聚苯乙烯泡沫模块可以用在哪些建筑上?
- WIN8 下IE突然无法打开(管理员权限可打开)
- 《Java程序员全攻略:从小工到专家》连载二:IT行情分布
- 薄壁轴承摩擦力矩_超薄壁球轴承的应用分析
- JN5169 NXP ZigBee PRO 无线网络应用所需的常见操作(一)
- 给Excel的数字单元格左上角加上绿色小三角
- DEV中右键菜单如何只在非空单元格上显示?
- 程序员职场-三人行,必有我师
- php斗鱼弹幕接口,php实现斗鱼弹幕,一起来欣赏弹幕吧~,斗鱼怎么看自己发过的弹幕...
- 猪懂傻改之《powershell 代码规范》
- android改微信号码,安卓版微信更新,已支持修改微信号
- windows,远程开机,远程唤醒(WOL,Wake-on-LAN),只在刚关机一段时间内可以实现,时间长了就无法实现
- 车规级需要满足哪些规范?
- 大数据---旅游业的新挑战
- 王选院士谈院士增选:院士未必总是学术权威
- 调用七牛云简单的上传附件的方法
热门文章
- 微软小冰作词又作曲,网友:要出道的节奏吗?
- 公开课 | 旷视科技产品总监:计算机视觉如何赋能身份验证场景
- 吴恩达教你如何使用“锤子”?机器学习新书免费领
- 如何用人工智能帮你找论文?
- 刚刚,DeepMind被IJCAI授予杰出成就奖,因为他家把AlphaGo Zero做成了暖心的新垣结衣?
- 漫画 | 人到中年,一地鸡毛
- 初入职场的我怎么就成了个打杂的,我是这样破局的 No.146
- 【廖雪峰python进阶笔记】模块
- 语言模型也不能乱说话!DeepMind发布GopherCite:讲话必须带证据
- 让炼丹更玄学!苏大博士生用「天干地支」生成随机种子,项目已开源