Mysql查询优化

mysq查询l优化

指标:执行时间 检查的行数 返回的行数

explain关键字

-- 实际SQL,查找用户名为Jefabc的员工
select * from emp where name = 'Jefabc';
-- 查看SQL是否使用索引,前面加上explain即可
explain select * from emp where name = 'Jefabc';

Mysql查询优化

expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

概要描述:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明

实例:

CREATE TABLE IF NOT EXISTS t(id INT , num INT DEFAULT 0,
NAME VARCHAR(20) );

CREATE INDEX ix_num ON t(num);
CREATE INDEX ix_id ON t(id);
CREATE INDEX ix_to ON t(num,id)
INSERT INTO t()VALUES(1,1,'zs'),(2,2,'ls'),(3,3,'ww');

#0、任何地方都不要使用 select * from t ,用具体的字段列表代替"*",不要返回用不到的任何字段

#1、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
EXPLAIN SELECT id FROM t WHERE NAME IS NULL;
#以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
EXPLAIN SELECT NAME FROM t WHERE num=0;

#2、应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描
EXPLAIN SELECT NAME FROM t WHERE num != 0;

#3、应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
EXPLAIN SELECT id FROM t WHERE num=0 OR NAME=0;
除非查询的字段与where子句中的字段都加了索引 例如:
EXPLAIN SELECT id,num FROM t WHERE num=0 OR id=0;
或者是使用UNion
EXPLAIN
SELECT id FROM t WHERE num=10
UNION ALL
SELECT id FROM t WHERE num=20

#4、in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:
#没有使用索引
EXPLAIN SELECT * FROM t WHERE num NOT IN (0);
EXPLAIN SELECT * FROM t WHERE num IN (0,2);
#使用了索引 后台默认为 where num=0
EXPLAIN SELECT id FROM t WHERE num IN (0);
EXPLAIN SELECT id FROM t WHERE num BETWEEN 1 AND 3;

#5、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
EXPLAIN SELECT id FROM t WHERE num/2=100
#应改为:
EXPLAIN SELECT id FROM t WHERE num=100*2

#6、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
EXPLAIN SELECT id FROM t WHERE SUBSTRING(id,1,3)='123'
#id以1开头的id,应改为:
EXPLAIN SELECT id FROM t WHERE id LIKE '123%'

1. count的优化

比如:计算id大于5的城市 a. select count() from world.city where id > 5; b. select (select count() from world.city) – count(*) from world.city where id

Original: https://www.cnblogs.com/zzc1102/p/16186599.html
Author: and脱发周大侠
Title: Mysql查询优化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505456/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Servlet规范

    servlet&#x89C4;&#x8303; 一。介绍1.它是javaee里面的一种规范。2.作用:1)在servlet规范中指定了动态资源文件的开发步骤2)在s…

    数据库 2023年6月11日
    053
  • BASE64处理文件

    Base64: Base64是一种编码方式,基于64个ASCII字符来表示二进制数据,Base64将8个bit为一个单位的字节数据拆分为以6个bit为一个单位的二进制片段,每6个b…

    数据库 2023年6月9日
    094
  • Socket 编码入门

    很多同行朋友大概率学过 socket 通信相关知识, send, recv, listen, connect, accept 等等组合, 变幻 无穷 … 相关的介绍书籍…

    数据库 2023年6月9日
    068
  • vue入门(一)

    模板语法 插值语法 功能:用于解析标签体内容 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。 指令语法 功能:用于解析标签(包括:标签属性、标签内…

    数据库 2023年6月6日
    085
  • 一段文字

    https://book.douban.com/review/13674387/现代人的困境,其实从出生开始每个人都有强烈的感受。我们会按户口管理,强调身份的是各种标签,各种统计数…

    数据库 2023年6月11日
    080
  • Django设置跨域访问

    Django设置跨域访问 pip install django-cors-headers (2) settings.py 配置如下 INSTALLED_APPS = [ # ‘dj…

    数据库 2023年6月14日
    096
  • Mongodb使用总结

    Mongodb使用总结 基于内存操作,便于与网站交互 数据库-集合-文档(存储多种数据类型),我们的操作都是基于单文档进行操作,并且通过冗余字段进行操作 嵌入式数组文档减少了对昂贵…

    数据库 2023年6月11日
    086
  • 使用clipboard.js复制文字+图片到微信后图片不显示问题处理

    使用clipboard.js复制文字 +图片,粘贴到微信不显示图片,而QQ可以。 解决方案: 图片链接使用http,不要使用https。 使用clipboard.js实现复制功能 …

    数据库 2023年6月14日
    0111
  • DM-DM之间的DBLINK

    1 创建外部链接 创建一个外部链接。 语法格式 CREATE [OR REPLACE] [PUBLIC] LINK STANDBY FIRST | PRIMARY ONLY | S…

    数据库 2023年6月11日
    077
  • spring内嵌cglib包,这里藏着一个大坑

    问题发现 2022-01-21 早上 9 点,订单系统出现大面积的”系统未知错误”报错,导致部分用户无法正常下单。查询后台日志,可以看到大量的 duplic…

    数据库 2023年6月6日
    0109
  • 2022蓝帽杯初赛wp(取证)

    战果 取证全解 misc出了1个 解其他题就像在坐牢 有那么一点思路,但不是完全有 手机取证_1 解压并打开阅读器,搜索627604C2-C586-48C1-AA16-FF33C3…

    数据库 2023年6月11日
    0101
  • MySQL&InnoDB锁机制全面解析

    目录 * – 一、前言 – 二、锁的类型 – + 2.1 全局锁 + 2.2 表级锁 + * 2.2.1 表锁 * 2.2.2 元数据锁(Met…

    数据库 2023年5月24日
    0102
  • 翻译|是否应该在 Kubernetes 上运行数据库?

    数据库如何在 Kubernetes 上运行?如果可以,哪些类型的数据库和数据最适合使用 K8s?让我们一起来看看。 Kubernetes 是用于自动部署、扩展和管理容器化应用程序的…

    数据库 2023年5月24日
    089
  • Linux指令_入门基础

    2.pwd指令 : 用法:#pwd (print working directory ,打印当前工作目录) 3.cd指令 : 命令:# cd (change directory,改…

    数据库 2023年6月11日
    0103
  • Guava中这些Map的骚操作,让我的代码量减少了50%

    Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另…

    数据库 2023年6月14日
    083
  • Python语法糖,提升编程幸福感!!!

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/a52bc938.html 大家好,我是测试蔡坨坨。 今天,我们来盘点一下Python中的那些语法糖。 …

    数据库 2023年6月11日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球