sql执行会生成一个巨大的临时表,当内存放不下时,要全部copy 到磁盘,导致IO飙升,时间开销增大。

额外收获知识收藏如下:

临时表存储

MySQL临时表分为“内存临时表”和“磁盘临时表”,其中内存临时表使用MySQL的MEMORY存储引擎,磁盘临时表使用MySQL的MyISAM存储引擎;

一般情况下,MySQL会先创建内存临时表,但内存临时表超过配置指定的值后,MySQL会将内存临时表导出到磁盘临时表;

使用临时表的场景

1)ORDER BY子句和GROUP BY子句不同, 例如:ORDERY BY price GROUP BY name;

2)在JOIN查询中,ORDER BY或者GROUP BY使用了不是第一个表的列 例如:SELECT * from TableA, TableB ORDER BY TableA.price GROUP by TableB.name

3)ORDER BY中使用了DISTINCT关键字 ORDERY BY DISTINCT(price)

4)SELECT语句中指定了SQL_SMALL_RESULT关键字 SQL_SMALL_RESULT的意思就是告诉MySQL,结果会很小,请直接使用内存临时表,不需要使用索引排序 SQL_SMALL_RESULT必须和GROUP BY、DISTINCT或DISTINCTROW一起使用 一般情况下,我们没有必要使用这个选项,让MySQL服务器选择即可。

直接使用磁盘临时表的场景

1)表包含TEXT或者BLOB列;

2)GROUP BY 或者 DISTINCT 子句中包含长度大于512字节的列;

3)使用UNION或者UNION ALL时,SELECT子句中包含大于512字节的列;

表的设计原则

使用临时表一般都意味着性能比较低,特别是使用磁盘临时表,性能更慢,因此我们在实际应用中应该尽量避免临时表的使用。 常见的避免临时表的方法有:

1)创建索引:在ORDER BY或者GROUP BY的列上创建索引;

2)分拆很长的列:一般情况下,TEXT、BLOB,大于512字节的字符串,基本上都是为了显示信息,而不会用于查询条件, 因此表设计的时候,应该将这些列独立到另外一张表。

SQL优化

如果表的设计已经确定,修改比较困难,那么也可以通过优化SQL语句来减少临时表的大小,以提升SQL执行效率。

常见的优化SQL语句方法如下:

1)拆分SQL语句

临时表主要是用于排序和分组,很多业务都是要求排序后再取出详细的分页数据,这种情况下可以将排序和取出详细数据拆分成不同的SQL,以降低排序或分组时临时表的大小,提升排序和分组的效率,我们的案例就是采用这种方法。

2)优化业务,去掉排序分组等操作

有时候业务其实并不需要排序或分组,仅仅是为了好看或者阅读方便而进行了排序,例如数据导出、数据查询等操作,这种情况下去掉排序和分组对业务也没有多大影响。

如何判断使用了临时表?

使用explain查看执行计划,Extra列看到Using temporary就意味着使用了临时表。

小结:

可见, 完全颠覆了对in操作符的认识,凡事儿都是要分情况讨论的

mysql select 临时表_mysql临时表的产生相关推荐

  1. mysql select语法_MySQL SELECT语法(一)SELECT语法详解

    SELECT的语法如下: SELECT[ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT ...

  2. mysql select表达式_MySQL数据库SELECT查询表达式解析

    数据的管理在很大一部分是在进行查找工作,而SELECT占据了很大的一部分 SELECT select_expr [,select_expr...] [ FROM table_reference WHE ...

  3. mysql select 缓存_mysql select缓存机制使用详解

    mysql Query Cache 默认为打开.从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过qu ...

  4. mysql select 使用_mysql select简单用法

    mysql select简单用法 1.select语句可以用回车分隔 $sql=select * from article where id=1 和 $sql=select * from articl ...

  5. mysql select效率_Mysql优化之selectcount效率_MySQL

    bitsCN.com 1.任何情况下SELECT COUNT(*) FROM tablename是最优选择: 2.尽量减少SELECT COUNT(*) FROM tablename WHERE CO ...

  6. mysql 中有没有临时表_MySQL临时表的简单用法

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...

  7. mysql 临时索引_MYSQL临时表创建索引

    标签: DROP TEMPORARY TABLE IF EXISTS tmp_record_t2; CREATE TEMPORARY TABLE tmp_record_t2 ( consumption ...

  8. mysql select 进阶_MySQL进阶_SELECT篇(一)

    MySQL中SELECT语句的基本语法是: SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] [DI ...

  9. mysql select大全_Mysql select 大全

    记录一些select的技巧,比如如何用IN.LIMIT.CONCAT.DISTINCT等MySQL关键字 记录一些select的技巧: 1.select语句可以用回车分隔 $sql="sel ...

  10. mysql select乱码_MySQL命令行查询乱码解决方法:

    MySQL会出现中文乱码的原因不外乎下列几点: 1.server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如 ...

最新文章

  1. Linux时间同步+国内常用的NTP服务器地址
  2. 历经数月投诉后,Firefox 移除了带误导性的按钮
  3. 如何正确使用Node.js中的事件
  4. oracle登录日志查看_last命令详解--查看Linux 登录日志+实例说明
  5. 计算机基础(八):linux编程规范总结
  6. 微信小程序报Cannot read property ‘setData‘ of undefined的错误
  7. 幽冥问答录:兼职阴间判官介绍阴间是什么样子
  8. 有意思的签到题集合~~
  9. GIWAXS数据处理流程详细
  10. 逆向工具IDA安装教程
  11. python语言实现图像的手绘效果
  12. 【备忘】尚学堂白贺翔java互联网架构师视频教程下载
  13. iOS 16横竖屏切换适配
  14. 搞独立运动,万人如海一身藏
  15. 互联网时代“陨落”,国家发布元宇宙战略的信号对失业和担心失业的我们带来了什么启迪?
  16. html背景图片的隐藏,CSS隐藏图片背景上方的文字内容
  17. commitizen和cz-customizable配置git commit message 1
  18. Latex第一次写论文记录
  19. FISCO BCOS 2022年度贡献者榜单
  20. Apache运行正常,但是localhost却打不开页面

热门文章

  1. 【小旭学长-使用python进行城市数据分析】笔记篇(中)
  2. 郭天祥的10天学会51单片机_第十节
  3. Mac电脑非常好用软件推荐
  4. 【AutoCAD】04.直线类命令
  5. ISCW实验11:使用SDM配置Site-to-Site IPSec ×××
  6. html公历农历相互转换,JavaScript实现公历转换农历
  7. 网站备案靠谱吗_网上出现的代理备案可信?为什么可以4-7天备案成功?
  8. 无人机倾斜摄影重建实景三维模型
  9. 编程语言大牛王垠的过去和现状
  10. 基金使用计划 数学建模 matlab,基金使用计划模型