sql语句时间花在哪了?

1 等待时间 2 执行时间

这两个时间并非孤立的,单条语句执行的快 其他语句等待的时间就少

执行时间花在哪了?

1 查找 沿着索引查找 慢者可能全表扫描

2 取出 查到行后,把数据取出来(sending data)

如何查询快?

1 查询快 联合索引的顺序 区分度 长度

2 取的快 索引覆盖(不回行)

3 传输的少 ,更少的行和列

切分查询:按数据拆分多次

插入1w行数据,每1000条为单位插入

分解查询:按逻辑把多表连接查询分成多个简单的sql

sql语句优化思路

不查 通过业务逻辑来计算

少查 尽量精准数据,少取行

高效的查 走索引查

explain分析:

explain select user_id,name from sys_user

id 查询序号 有几个id就是查询了几次

select_type 简单查询

table 查询表

type 索引扫描多少

possible_keys 系统估计可能用到的键 只能用1个

key 真正用到的键

key_len 用到的键长度

ref 联查引用关系

rows 估计本次查多少行

extra 额外信息

select_type 类型:

simple (不含子查询)

primary( 含子查询或派生查询 )

--> subquery ( 非from子查询)

--> derived (from型子查询)

--> union

--> union result (往往和union同时出现)

table :

可能是 :

1 实际表名 select * from t1

2 表的别名 select * from t2 as a

3 derived from 子查询时

4 null 没有from

possible_keys:

可能用到的索引,但最终,只能用到1个

key:

最终使用到的索引

key_len

使用索引的最大长度

表达式用不上索引!

如select * from goods where goods_id +1 > 31

type类型:

1 all 扫描所以的数据,意味着从表的第一行往后全表扫描 运气不好扫描到最后一行 最慢

select * from email where uname = 'lisi'

2 index 扫描所有的索引节点 比all快点

select email from email where ...

3 range 查询时,能根据索引做范围的扫描

select * from goods where good_id > 25

4 ref 通过索引列,可以直接引用到某些数据行

select good_id from goods where cat_id = 25

5 eq_ref 通过索引列,可以直接引用到某1行数据 常见连接查询中

6 const system null 这3个分别值查询优化到常量级别,甚至不需要查找时间

一般按主键查询时 易出现const system

直接查询某个表达式 不经过表时 出现null

ref 类型:

连接查询时,表之间的字段引用关系(2个表关联的那个字段)

rows:

估计要扫描多少行

extra:

1 using index 索引覆盖 效率非常高 不需要回行

2 using where 光靠索引定位不了 还得配合where判断一下

3 using temporary 指用上了临时表

4 using filesort 文件排序(可能在内存或磁盘) 比较长的列如text列 就要在磁盘上排序了

in 型子查询引出的陷阱

题:在商城表中 查询6号栏目的商品,6号是一个大栏目里面有78911小栏目

select * from goods where cat_id in (select cat_id from category where parent_id = 6)

误区:给我们的感觉是先查到内存的6号栏目的子栏目 然后外层cat_id in (7,8,9,11)

事实,goods表全盘扫描并逐行与category 表对照看parent_id = 6 是否成立

原因:mysql查询优化器,针对in型做优化,被改成了exists子查询的执行结果 当goods表越大时,查询速度越慢

改进: 用连接查询来代替子查询

select * from goods inner join (select cat_id from category where parent_id = 6) as tmp

on goods .cat_id = tmp.cat_id

exists 子查询也会有这种问题

from型子查询

内层from语句查到的临时表,是没有索引的 所以from的返回内容要尽量少 需要排序 在内层先排好序

count和union

1 count优化:

误区:

1 myisam的count()非常快

仅限于所有行比较快,因为myisam对行数进行了存储,一旦有条件的查询,速度就不再快了 尤其是where条件的列上没有索引

2 想查id>= 100的列 很慢

小技巧:查id<100 在用总数减

select count(*) from com 快

select count(*) from com where id<100 快

select count(*) from com - select count(*) from com where id<100 快

3 group by

注意:

1 分组用于统计,不用于筛选重复数据

用 group by 去重效率低

group by 列要有索引 可以避免临时表和文件排序

2 以ab表连接为例 主要查询a表的列

那么group by,order by 的列尽量相同,而且列应该显示声明为a的列

select * from a inner join b group by a.cat_id order a.cat_id

4 union 优化

union一定要用到临时表

注意: 1 union 的字句条件要尽量具体 即 查询更少的行

2 字句的结果在内存里并成结果集 需要去重复 去重复就得先排序 而加all之后,不需要去重

所以union尽量加all

limit 及 翻页优化

select * from table limit m,n

select * from table limit 100,3

指从第100条开始 往后取3条,不过实际上不是直接数到100取的 而且取103条再把前100条扔了

所以 offset 越大 效率越低 (m)

优化方法:

1 从业务上去解决 办法: 不允许翻到100页 以百度为例 一般翻页只能到70多页(推荐)

2 不用offset 用条件查询

改成 where id > 100 limt 3;(要求 id 不能缺 缺了就不等效了)

好处: 可以用索引

问题:如果id缺了 2次结果不一致

原因: 数据被物理删除过,有空洞

解决:数据不进行物理删除(可以逻辑删除) 最终在页面上显示数据时,逻辑删除的条目不显示即可

(一般来说大网站的数据都是不物理删除的,只做逻辑删除,如is_delete=1)

3 非要物理删除,还要用offset精确查询,还不限制用户分页怎么办

select * from lx_com

inner join

(select id from lx_com limit 100000,3)as tmp

on lx_com.id = tmp.id

分析: 优化思路是 不查 少查 查索引 少取列

我们现在必须要查,则只查索引 不查数据 得到id 再用id去查具体条目,这种技巧就是延迟关联

SQL语句优化 学习笔记的更多相关文章

  1. Oracle PL/SQL语句基础学习笔记(上)

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE server和其它工具中了,近几年中很多其它的开发者和DBA開始使用PL/SQL,本文将讲述PL ...

  2. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  3. 重新学习MySQL数据库12:从实践sql语句优化开始

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/79394168 本文不堆叠网上海量的sql优化技巧或 ...

  4. SQL反模式学习笔记3 单纯的树

    2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...

  5. SQL反模式学习笔记9 元数据分裂

    目标:支持可扩展性.优化数据库的结构来提升查询的性能以及支持表的平滑扩展. 反模式:克隆表与克隆列 1.将一张很长的表拆分成多张较小的表,使用表中某一个特定的数据字段来给这些拆分出来的表命名. 2.将 ...

  6. SQL反模式学习笔记13 使用索引

    目标:优化性能 改善性能最好的技术就是在数据库中合理地使用索引.  索引也是数据结构,它能使数据库将指定列中的某个值快速定位在相应的行. 反模式:无规划的使用索引 1.不使用索引或索引不足 2.使用了 ...

  7. SQL反模式学习笔记16 使用随机数排序

    目标:随机排序,使用高效的SQL语句查询获取随机数据样本. 反模式:使用RAND()随机函数 SELECT * FROM Employees AS e ORDER BY RAND() Limit 1 ...

  8. SQL反模式学习笔记17 全文搜索

    目标:全文搜索 使用SQL搜索关键字,同时保证快速和精确,依旧是相当地困难. SQL的一个基本原理(以及SQL所继承的关系原理)就是一列中的单个数据是原子性的. 反模式:模式匹配 使用Like 或者正 ...

  9. SQL反模式学习笔记21 SQL注入

    目标:编写SQL动态查询,防止SQL注入 通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. 反模式:将未经验证的输入作为代码执行 当向SQL查询的字符串中插入别 ...

随机推荐

  1. HBuilder搭建Android模拟器

    HBuilder搭建Android模拟器  //来源:  https://www.cnblogs.com/bjxingch/articles/6657938.html  1.下载夜神Android模拟 ...

  2. C++入门经典-例3.2-根据分数判断是否优秀

    1:代码如下: // 3.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  3. 第六周学习总结&java实验报告四

    第六周学习总结&java实验报告四 学习总结: 上一周因为接近国庆假期,所以老师没有讲太多的新知识点,只要是带我们一起做了一个动物模拟变声器的实验,进一步了解和学习到继承的 有关知识点和应用: ...

  4. LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)

    打家劫舍 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报 ...

  5. LeetCode 19. 删除链表的倒数第N个节点(Remove Nth Node From End Of List)

    题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后, ...

  6. 搜狗输入法弹窗搜狐新闻的处理 以及sogoucloud.exe的处理

    https://www.cnblogs.com/Asa-Zhu/p/3359034.html 使用everything搜索SohuNews.exe,然后找到安装路径C:\Program Files ( ...

  7. 全面解读PHP-数据库缓存

    一.什么是数据库缓存? 1.定义 mysql等一些常见的关系型数据库的数据都存储在磁盘当中,在高并发场景下,业务应用对mysql产生的增删改查的操作会造成巨大的IO开销和查询压力,这无疑对数据库和服务 ...

  8. python问题笔记

    1.for...in...:和while...:循环末端都可以有一个else:语句,但他仅在循环不是由break语句退出时才会被运行 2.input raw input区别 一. 可以看到:这两个函数 ...

  9. 深度学习----现今主流GAN原理总结及对比

    原文地址:https://blog.csdn.net/Sakura55/article/details/81514828 1.GAN 先来看看公式:             GAN网络主要由两个网络构 ...

  10. KNN距离函数的简单拓展

    KNN--k-NearestNeighbor可以是是分类法中最简单的算法了. 大致的idea为:找出k各跟新数据点最像的点,看这些点主要属于哪类,那么新数据点也就属于哪类的了. 其伪代码如下: 1. ...