《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 安装并启动 ...
随机推荐
- IDEA2018全局搜索中搜索jar包/lib
搜索jar包 配置find in path ctrl+shift+f 点击 ...处 把lib添加进来 点击OK保存 之后在IDEA中 , 双击shift , 调出全局搜索框就可以搜索到 jar包里的 ...
- PHP 之去除代码中的注释
测试文件代码如下: <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/10/16 * Time: 10:25 */ // 计算 ...
- ICEM-圆柱与长方体相切
原视频下载地址:https://yunpan.cn/cqvgLe39ZU4Ke 访问密码 c1c9
- JAVA基础知识|Executors提供的四种线程池
一.Thread与Executors 开启新的线程,我们经常会采用如下方法: Thread thread =new Thread(new Runnable() { @Override public v ...
- springMVC_注解方式搭建基础环境
---恢复内容开始--- 一.jar包环境,web配置文件和Spring-MVC配置文件的,相关的modelAndview 1.配置DispatcherServlet <servlet> ...
- 使用多个tomcat如何修改端口号
一.找到tomcat下conf文件夹下server.xml: 二.修改8080端口 三.修改8009端口 四.修改8005端口 修改后同时启动多个tomcat成功.
- 解决跨操作系统平台JSON中文乱码问题
解决跨操作系统平台JSON中文乱码问题 LINUX统一使用utf-8编码,WINDOWS却不是. LINUX中间件,传输JSON给WINDOWS程序,会乱码. 解决办法: 对JSON字段是字符串类型的 ...
- 如何在Windows Server 2008服务器中把Tomcat启动程序添加到服务中
转自:https://blog.51cto.com/zdytesting/2314093 tomcat所在的bin目录: 添加服务: service install service_name 移除服务 ...
- BAT文件运行时不显示命令窗口的方法
可以编一个VBS文件调用BAT文件,使运行BAT文件时不显示命令窗口. 新建一个记事本文件,保存为abc.vbs,在文件中加入如下代码: Set shell = Wscript.createobjec ...
- angular 中的dom操作(原生JS)
<h2>这是一个home组件--DOM操作演示</h2> <div id="box"> this is box </div> < ...