《Mysql - SQL优化》
一:在查询语句时,应该注意的优化问题
- SELECT语句务必指明字段名称
- SELECT * 会增加很多不必要的消耗(CPU、IO、内存、网络带宽)
- 同时会让 Mysql 优化器无法优化
- 在确定数据集大小的情况下,使用 limit 指明 数据数量
- Mysql 是在先返回结果集之后再进行计算,然后抛弃其中大部分数据
- 筛选时注意字符类型
- 避免SQL 隐式转换,导致索引失效
- SQL 语句中 IN 包含的值不应过多
- MySQL对于 In 做了相应的优化,即将 In 中的常量全部存储在一个数组里面,而且这个数组是排好序的。
- 但是如果数值较多,产生的消耗也是比较大的。
- 排序在任何时候的消耗都是昂贵的
- 尽量在需要排序的字段建立索引。
- 如果一定要使用 OR 的话
- 请在 OR 的两侧都加上索引
- 尽量用 union all 代替 union
- union 和 union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。
- 当然,union all的前提条件是两个结果集没有重复数据。
- 避免在 where 子句中对字段进行 null 值判断
- 对于 null 的判断会导致引擎放弃使用索引而进行全表扫描。
- 注意范围查询语句
- 对于联合索引来说,如果存在范围查询,比如between、>、<等条件时,会造成后面的索引字段失效。
- 模糊匹配的时候%不要在头部
- 会导致索引列的失效
- 关联查询
- 确保关联查询的 ON 键上都有索引
二 :Count( ) 优化
- 概述
- 通常来说,Count() 都需要扫描大量的行,才能获得精确的数据,因此优化是困难的。
- ‘快速/精确/实现简单’,三者只能满足其二。必须舍弃掉一个。
- Count 真正的作用
- 统计某个列值的数量(不为null)
- 统计结果集行数
- 当Mysql确认括号内的表达式不可能为空时,实际上就是在统计行数.
- 最简单的就是当我们使用 Count(*) 时候,这种时候通配符 * 并不会像我们猜想那样扩展成所有列,而是直接统计所有行数。
- 常见的问题是
- 在括号内指定了列却希望统计结果集的行数。 如果你希望知道的是结果集的行数,请使用Count(*),这样最清晰,性能也会很好。
- 关于MyISAM 的 Count 神话
- 在 没有任何 Where 的条件下, Count(*) 才是很快的。
- 当存在 Where 的字句时候,就和其他引擎没什么区别了。
- 优化方案
- 可以使用近似值 EXPLAIN 获取近似值,但是,他可能是不准确的。
- 可以使用 Redis / memcache 缓存数量。
- 建立汇总表,维护数量。
《Mysql - SQL优化》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- 分布式的一致性(分布式事物)-------2PC详述
英文名:Two Phase Commit(2PC) 算法目的:实现分布式事物 算法概述: 有两类节点: -----协调者 -----事务参与者 流程阶段: -----请求阶段 -----提交阶段 算法 ...
- meshing-缺角正方体
原视频下载地址:https://yunpan.cn/cqLyi92H5Akh5 访问密码 1d48
- git 设置git用户名和邮箱,并生成秘钥
1.设置 git 用户名 aaron@ubuntu:~$ git config --global user.name "xxx" 2.设置 git 邮箱 aaron@ubuntu: ...
- 控制 Python 工具箱中的许可行为
def isLicensed(self): """Allow the tool to execute, only if the ArcGIS 3D Analyst 扩展模 ...
- Function mysql_db_query() is deprecated 错误解决
方法一:@ 在任何错误语句之前加上@符号,即可屏蔽! 方法二:error_reporting 在PHP文件第一行加上:error_reporting(0); 即可屏蔽! 方法三:display_err ...
- Qt pri文件
pri文件就是一个简单的文件夹包含或者动态库调用路径等说明,在pro文件里include了pri文件,相当于把pri文件的内容直接复制到pro文件中
- javascript中的Error对象
在javascript中一旦代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个基本的属性: ...
- Qt编写自定义控件44-天气仪表盘
一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...
- SSM基于Token的登录认证
1.什么是token token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识. 当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上 ...
- 数据结构与算法 Javascript描述
数据结构与算法系列主要记录<数据结构与算法 Javascript描述>学习心得