《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 安装并启动 ...
随机推荐
- 1059 Prime Factors(25 分)
Given any positive integer N, you are supposed to find all of its prime factors, and write them in t ...
- 【原创】go语言学习(十)Map类型
目录 声明和初始化 基本操作 map排序 map类型的切⽚片 课后作业 声明和初始化 1.map类型是⼀一个key-value的数据结构. //var a map[key的类型]value类型 var ...
- Python的十种常见算法
十种排序算法 1. 常见算法分类 十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序: a. 交换类排序(快速排序.冒泡排序) b. 插入类排序(简单插入排序.希尔排序) c. ...
- Ubuntu 14.04 源
清华源https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ ubuntu 14.04 官方源 # deb cdrom:[Ubuntu 14.04.4 LT ...
- FOI冬令营 Day1
目录 T1.全连(fc) 传送门 Code T2.原样输出(copy) 传送门 Code T3.不同的缩写(diff) 传送门 Code 打算把省冬的题目放上来,主要是防止自己偷懒不订正 T1. ...
- Atcoder ABC 141
Atcoder ABC 141 A - Weather Prediction SB题啊,不讲. #include<iostream> #include<cstdio> #inc ...
- AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u012881904/article/de ...
- Interacted Action-Driven Visual Tracking Algorithm
文章来源:Attentional Action-Driven Deep Network for Visual Object Tracking 博士论文(2017年8月份完稿) http://s-s ...
- PYNQ系列学习(二)——pynq与zynq对比(一)
Zynq可扩展处理平台是赛灵思新一代 FPGA的可编程技术的产品系列.与采用嵌入式处理器的FPGA不同,Zynq产品系列的处理系统不仅能在开机时启动,而且还可根据需要配置可编程逻辑.采用这种方法,软件 ...
- python socketpool:通用连接池
简介 在软件开发中经常要管理各种“连接”资源,通常我们会使用对应的连接池来管理,比如mysql数据库连接可以用sqlalchemy中的池来管理,thrift连接可以通过thriftpool管理,red ...