摘要: 出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

  • x220 笔记本 , cpu: i5-2520 , 磁盘intel ssd sata2接口 , 就是这么搓的环境 :(
  • 源语句

select * from employees e inner join
(select emp_no ,count(*) from salaries group by emp_no) s
on s.emp_no = e.emp_no where e.emp_no between 10001 and 10010;

+----+-------------+------------+------------+-------+----------------+-------------+---------+--------------------+---------+----------+-------------+
| id | select_type | table      | partitions | type  | possible_keys  | key         | key_len | ref                | rows    | filtered | Extra       |
+----+-------------+------------+------------+-------+----------------+-------------+---------+--------------------+---------+----------+-------------+
         |   100.00 | Using where |
 | PRIMARY     | <derived2> | NULL       | ref   | <auto_key0>    | <auto_key0> | 4       | employees.e.emp_no |      10 |   100.00 | NULL        |
         |   100.00 | Using index |
+----+-------------+------------+------------+-------+----------------+-------------+---------+--------------------+---------+----------+-------------+
+--------+------------+------------+-----------+--------+------------+--------+----------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  | emp_no | count(*) |
+--------+------------+------------+-----------+--------+------------+--------+----------+
     |
     |
     |
     |
     |
     |
     |
     |
     |
     |
+--------+------------+------------+-----------+--------+------------+--------+----------+
 rows in set (1.00 sec)
  • 从id=2开始就先执行salaries 表的子查询 , 可以看出红色字部分是临时索引,从5.6开始就有这个功能,这个临时索引是在内存生成的,如果返回数据量大占用内存越多,表之间关联性能就下降,也有可能把内存涨满 , 最终用了1秒执行效率
  • 现在想把这个salaries表的子查询跟employees表同一时间执行,并且达到性能效率提升
  • 创建一个存储过程另外关联这个salaries表,如下:
create FUNCTION t1(in_emp_no int ) RETURNS INT
BEGIN
DECLARE a1 int ;
select count(*) into a1 from salaries where emp_no = in_emp_no group by emp_no;
RETURN a1;
end;
mysql  and t1(e.emp_no);
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
         |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
 row  warning (0.00 sec)
  • 变成了只有一个表运行,而salaries 和 employees 关联在另外一个线程执行存储过程, 至于怎样从mysql核心看它执行这个稍后揭晓 , 最终使用了0.01秒执行 , 记住这是5年前的x220哦
+--------+------------+------------+-----------+--------+------------+--------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  | t1(e.emp_no) |
+--------+------------+------------+-----------+--------+------------+--------------+
    |
    |
    |
    |
    |
    |
    |
    |
    |
    |
+--------+------------+------------+-----------+--------+------------+--------------+
 rows in set (0.01 sec)

MySQL使用存储过程代替子查询的更多相关文章

  1. mysql update不支持子查询更新

    先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...

  2. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

  3. MySQL 使用JOIN优化子查询

    1.数据准备 mysql> select * from student; +----+--------+----------+---------+-------------+ | id | na ...

  4. mysql sql_safe_updates 不支持子查询的更新。

    考虑到开发人员有时候不小心误更新数据,要求线上库的 MySQL 实例都设置 sql_safe_updates=1 来避免没有索引的 update.delete. 结果有一天开发发现下面的一个SQL 没 ...

  5. php+mysql 内联接 和 子查询

    INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录 $sql="SELECT * FROM subject as a INNER JOIN e_user as b ON a. ...

  6. mysql 外键和子查询,视图

    1.mysql 外键约束 建表时生成外键   foreing key ('sid') references' student'('id'); 建表后添加外键  alter table' course ...

  7. MySQL(八)子查询和分组查询

    一.子查询 1.子查询(subquery):嵌套在其他查询中的查询. 例如:select user_id from usertable where mobile_no in (select mobil ...

  8. 为什么MySQL不推荐使用子查询和join

    前言: 1.对于mysql,不推荐使用子查询和join是因为本身join的效率就是硬伤,一旦数据量很大效率就很难保证,强烈推荐分别根据索引单表取数据,然后在程序里面做join,merge数据. 2.子 ...

  9. MySQL数据库(11)----使用子查询实现多表查询

    子查询指的是用括号括起来,并嵌入另一条语句里的那条 SELECT 语句.下面有一个示例,它实现的是找出与考试类别('T')相对应的所有考试事件行的 ID,然后利用它们来查找那些考试的成绩: SELEC ...

随机推荐

  1. Python笔记·第七章—— IO(文件)处理

    一.文件处理简介 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知 ...

  2. 【转载】Java系列笔记(3) - Java 内存区域和GC机制

    Java系列笔记(3) - Java 内存区域和GC机制 转载:原文地址http://www.cnblogs.com/zhguang/p/3257367.html 目录 Java垃圾回收概况 Java ...

  3. vue.js使用webpack发布,部署到服务器上之后在浏览器中可以查看到vue文件源码

    webpack+vue 2.0打包发布之后,将发布的文件部署到服务器中之后,浏览器中访问的时候会出现一个webpack文件夹,里边会显示vue文件源码 如果不想让vue源文件显示出来,可以在confi ...

  4. html5笔记——<section> 标签

    定义和用法 <section> 标签定义文档中的节(section.区段).比如章节.页眉.页脚或文档中的其他部分. 注意: section 不是一个专用来做容器的标签,如果仅仅是用于设置 ...

  5. Material使用08 MdDialogModule、MdAutocompleteModule

    1 MatDialog 1.1 简要描述 MdDialog是一个服务,可以利用它来打开一个具有material风格和动画效果的对话框 技巧01:虽然已经在模块级别导入了MdDialogModule但是 ...

  6. org.elasticsearch.transport.ReceiveTimeoutTransportException[cluster:monitor/nodes/liveness] request_id [31] timed out after [5000ms]

    ES连接超时,异常信息 2017-09-07 10:42:45.042 [elasticsearch[Bantam][transport_client_worker][T#17]{New I/O wo ...

  7. Linux useradd

    在 linux 中,如果我们想添加一个用户,那么使用的命令如下: useradd  [ 用户名 ] 实例如下: 那么添加密码如下: passwd   [ 用户名 ] 实例如下: 然后输入密码,学过一点 ...

  8. ligerUI---下拉框(Combobox)

    写在前面: 突然发现,从刚开始对ligerUI的抵触,觉得都没有接触过,也不会,到现在,感觉ligerUI的一些组件还是挺好用的,大概日久生情吧.嘻嘻~~~,下拉框是常用的一个组件,在之前的博客中也写 ...

  9. spring mvc报错,数据库查询无限死循环

    进行查询的陷入了无限死循环,原因是问题类中包含了回答,回答类中包含了问题,进入了无限死循环 解决方法:在回答类中的问题类属性上加注解:@JsonBackReference 问题中有回答的set集合,回 ...

  10. Keras的安装与配置

    Keras是由Python编写的基于Tensorflow或Theano的一个高层神经网络API.具有高度模块化,极简,可扩充等特性.能够实现简易和快速的原型设计,支持CNN和RNN或者两者的结合,可以 ...