Mysql优化系列之查询优化干货1
从这一篇开始,准备总结一些直接受用的sql语句优化,写sql是第二要紧的,第一要紧的,是会分析怎么查最快,
因为当你写过很多sql后,查询出结果已经不是目标,快,才是目标。另外,通过测试和比较的结果才是有说服力的。
1、COUNT()查询
介绍:聚合函数。用于统计某个列值的数量,以及统计行数。如果统计列值要求列值非空,进一步,如果COUNT()
括号中指定了列或列的表达式,则统计这个表达式有值的结果(即表达式非空)。如果Mysql确认括号内表达式值不可能
为空,实际上会统计行数。再进一步,如果是COUNT(*)通配符,Mysql会忽略所有的列直接统计行数。
最后得出的结论是:如果想统计行数或结果集行数,不要在括号内指定具体的列或列的表达式,直接COUNT(*)
而COUNT(f(col_name))计算的是f(col_name)非空行数量。
另外值得注意的一点:COUNT(Expression= "xxx" OR NULL)表示统计表达式值为xxx的行数,当表达式值不等于
xxx时,Expression= "xxx"值为false,前面讲了count(xxx)函数的统计规则,结合or运算符可以推测下为什么需要加
OR NULL这个条件
其他的思路:使用Redis缓存计数,使用汇总表
2、关联查询
关联查询最需要优化的就是索引列
(1)ON子句的列要有索引,且只需要在第二个表的相应字段上建索引,但是优化器关联表的顺序需要测试和分析
(2)确保GROUP BY 和 ORDER BY的表达式只涉及到一个表中的列
3、子查询
不要使用,不要使用,除非有人拿枪逼着你使用,子查询改成关联查询
4、LIMIT分页
一个事实:offset非常大的时候,记录要扫描,但是结果集却会抛弃掉,比如 limit 10000,20,需要扫描10020条,但是
却只需要后面的20条。一般的做法是先计算出要返回的记录的第一条和最后一条的位置,比如这个例子是10000,10019,通
常这个表应该有一个自增的id,那么就是id between 10000,10019
另一种思路是在前端UI上分页的方式上下功夫,此处略去
5、UNION操作
在《高性能Mysql》一书中作者提到,Mysql总是通过创建并填充临时表的方式来执行UNION查询。而临时表是没有索引
优化的。除非确实需要消除重复的行,否则一定要用UNION ALL。如果没有ALL关键字,Mysql会给临时表加上DISTINCT选
项,也就是唯一性检查,这需要不小的代价
截止这篇,如果你能大致的理解Mysql是如何执行查询的,能手写项目中80%的sql,能设计出不错的表结构,索引,以及
学会测试和使用命令查询可能存在的优化漏洞,中等数据量的项目应该是没问题的。在接下来的篇章,笔者将在项目中实践一
些Mysql的高级特性。
Mysql优化系列之查询优化干货1的更多相关文章
- Mysql优化系列(2)--通用化操作梳理
前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...
- (转)MySQL优化系列
原文:http://blog.csdn.net/jack__frost/article/details/71194208 数据库,后端开发者必学,而且现在以MySQL居多.这个系列将系统化MySQL一 ...
- Mysql优化系列之查询性能优化前篇1
前言 这是优化系列的最后一篇的第1小篇,我们其实可以直接从sql怎么写讲起,why not?但是我还是决定花2个篇幅 问一些问题,带着几个问题循序渐进的往下走. 一个sql语句是怎么被执行的? sql ...
- Mysql优化系列之数据类型优化
本篇是优化系列的第一篇:数据类型 为了不产生赘述,尽量用简洁的语言来描述. 在选择数据类型之前,首先要知道几个原则: 更小的通常更好 尽量使用可以正确存储数据的最小数据类型.更小的数据类型意味着更快, ...
- mysql优化一之查询优化
这一篇笔记的mysql优化是注重于查询优化,根据mysql的执行情况,判断mysql什么时候需要优化,关于数据库开始阶段的数据库逻辑.物理结构的设计结构优化不是本文重点,下次再谈 查看mysql语句的 ...
- Mysql优化系列之——优化器对子查询的处理
根据子查询的类型和位置不同,mysql优化器会对查询语句中的子查询采取不同的处理策略,其中包括改写为连接(join),改写为半连接(semi-join)及进行物化处理等. 标量子查询(Scalar S ...
- 3.MySQL优化---单表查询优化的一些小总结(非索引设计)
整理自互联网.摘要: 接下来这篇是查询优化.其实,大家都知道,查询部分是远远大于增删改的,所以查询优化会花更多篇幅去讲解.本篇会先讲单表查询优化(非索引设计).然后讲多表查询优化.索引优化设计以及库表 ...
- MySQL优化系列之一
MySQL数据库常见的两个瓶颈是CPU和I/O. CPU在饱和的情况下一般发生在数据装入内存或者从磁盘上读取数据的时候,当装入的数据远大于 内存容量的时候,这时可能会发生I/O瓶颈, 如果是分布式应用 ...
- Mysql优化系列之查询性能优化前篇3(必须知道的几个事实)
事实一:临时表没有任何索引 最常见的临时表莫过于在from子句中写子查询,遇到这种情况,Mysql会先将其查询结果放到一张临时表中, 然后将这个临时表当做普通表对待 事实二:执行计划优化 大多数的sq ...
随机推荐
- look at me
I would bet my life, like I bet my heart我以生命与真心担保That you were the one, baby你就是我的命中注定I've never been ...
- Java Swing 窗体屏幕居中
Java开发桌面程序用AWT或SWING,可以用设置主窗口位置,使主窗口居中一般使用下面的方法: 01.第一种方法 int windowWidth = frame.getWi ...
- thinkphp 防止XSS(跨站脚本攻击)
XSS(跨站脚本攻击)可以用于窃取其他用户的Cookie信息,要避免此类问题,可以采用如下解决方案: 直接过滤所有的JavaScript脚本: 转义Html元字符,使用htmlentities.htm ...
- 大数据学习路线,来qun里分享干货,
一.Linux lucene: 全文检索引擎的架构 solr: 基于lucene的全文搜索服务器,实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面. 推荐一个大数据学习群 ...
- ETL详解
ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要的一个环节. 通常情况下,在 ...
- hdu多校第七场 1011 (hdu6656) Kejin Player 概率dp
题意: 一个游戏,有许多关,到下一关要花费金钱,做出尝试,有概率成功,若成功则到达下一关,若失败则停在此关或退回到前面某关,询问第l关到第r关的期望费用 题解: 显然,第r关到第l关的费用是dp[r] ...
- sqlserver 调优(二)
良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主要讲到如何改善SQL语句,还将有另一篇讨论如何改 ...
- mysql 导出导入数据 -csv
MySql数据库导出csv文件命令: mysql> select first_name,last_name,email from account into outfile 'e://output ...
- opencv-图像形态学之开运算、闭运算、形态学梯度、顶帽、黑帽合辑
转自:https://blog.csdn.net/poem_qianmo/article/details/24599073 1.1 开运算(Opening Operation) 开运算(Opening ...
- docker网络原理
以下内容引用Docker -- 从入门到实践 当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机.它会在挂 ...