MySQL内部临时表策略_MySQL
bitsCN.com
MySQL内部临时表策略 通过对MySQL数据库源码的跟踪和调试,以及参考MySQL官方文档,对MySQL内部临时表使用策略进行整理,以便于更加深入的理解。使用内部临时表条件 MySQL内部临时表的使用有一定的策略,从源码中关于SQL查询是否需要内部临时表。可以总结如下: 1、DISTINCT查询,但是简单的DISTINCT查询,比如对primary key、unique key等DISTINCT查询时,查询优化器会将DISTINCT条件优化,去除DISTINCT条件,也不会创建临时表; 2、不是第一个表的字段使用ORDER BY 或者GROUP BY; 3、ORDER BY和GROUP BY使用不同的顺序; 4、用户需要缓存结果; 5、ROLLUP查询。 源码如下所示 代码地址:sql_select.cc:854,函数:JOIN::optimize(),位置:sql_select.cc:1399 /* Check if we need to create a temporary table. This has to be done if all tables are not already read (const tables) and one of the following conditions holds: - We are using DISTINCT (simple distinct's are already optimized away) - We are using an ORDER BY or GROUP BY on fields not in the first table - We are using different ORDER BY and GROUP BY orders - The user wants us to buffer the result. When the WITH ROLLUP modifier is present, we cannot skip temporary table creation for the DISTINCT clause just because there are only const tables. */ need_tmp= (( const_tables != tables && (( select_distinct || !simple_order || !simple_group) || ( group_list && order ) || test(select_options & OPTION_BUFFER_RESULT))) || ( rollup.state != ROLLUP:: STATE_NONE && select_distinct )); 内部临时表使用原则 但是使用了内部临时表,那么他是怎么存储的呢?原则是这样的: 1、当查询结果较小的情况下,使用heap存储引擎进行存储。也就是说在内存中存储查询结果。 2、当查询结果较大的情况下,使用myisam存储引擎进行存储。 3、当查询结果最初较小,但是不断增大的情况下,将会有从heap存储引擎转化为myisam存储引擎存储查询结果。 什么情况算是查询结果较小呢?从源码中if的几个参数可以看出: 1、有blob字段的情况; 2、使用唯一限制的情况; 3、当前表定义为大表的情况; 4、查询结果的选项为小结果集的情况; 5、查询结果的选项为强制使用myisam的情况。 源码如下所示 代码地址:sql_select.cc:10229,函数:create_tmp_table(),位置:sql_select.cc:10557 /* If result table is small; use a heap */ /* future: storage engine selection can be made dynamic? */ if ( blob_count || using_unique_constraint || ( thd->variables .big_tables && !( select_options & SELECT_SMALL_RESULT )) || ( select_options & TMP_TABLE_FORCE_MYISAM )) { share->db_plugin = ha_lock_engine(0, myisam_hton); table->file = get_new_handler( share, &table ->mem_root, share->db_type ()); if (group && ( param->group_parts > table-> file->max_key_parts () || param->group_length > table-> file->max_key_length ())) using_unique_constraint=1; } else { share->db_plugin = ha_lock_engine(0, heap_hton); table->file = get_new_handler( share, &table ->mem_root, share->db_type ()); } 代码地址:sql_select.cc:11224,函数:create_myisam_from_heap(),位置:sql_select.cc:11287 /* copy all old rows from heap table to MyISAM table This is the only code that uses record[1] to read/write but this is safe as this is a temporary MyISAM table without timestamp/autoincrement or partitioning. */ while (! table->file ->rnd_next( new_table.record [1])) { write_err= new_table .file-> ha_write_row(new_table .record[1]); DBUG_EXECUTE_IF("raise_error" , write_err= HA_ERR_FOUND_DUPP_KEY ;); if (write_err ) goto err ; }官方文档相关内容 以上内容只是源码表面的问题,通过查询MySQL的官方文档,得到了更为权威的官方信息。 临时表创建的条件: 1、如果order by条件和group by的条件不一样,或者order by或group by的不是join队列中的第一个表的字段。 2、DISTINCT联合order by条件的查询。 3、如果使用了SQL_SMALL_RESULT选项,MySQL使用memory临时表,否则,查询询结果需要存储到磁盘。 临时表不使用内存表的原则: 1、表中有BLOB或TEXT类型。 2、group by或distinct条件中的字段大于512个字节。 3、如果使用了UNION或UNION ALL,任何查询列表中的字段大于512个字节。 此外,使用内存表最大为tmp_table_size和max_heap_table_size的最小值。如果超过该值,转化为myisam存储引擎存储到磁盘。
参考资料:1、MySQL源码:MySQL-5.5.202、MySQL官方文档:http://dev.mysql.com/doc/refman/5.5/en/internal-temporary-tables.html 作者 king_wangheng bitsCN.com

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP秒杀系统中的价格策略和促销活动设计要点在一个秒杀系统中,价格策略和促销活动设计是非常重要的一部分。合理的价格策略和精心设计的促销活动可以吸引用户参与秒杀活动,提升系统的用户体验和盈利能力。下面将详细介绍PHP秒杀系统中的价格策略和促销活动设计要点,并提供具体的代码示例。一、价格策略设计要点确定基准价格:在秒杀系统中,基准价格是指商品正常销售时的价格。在

EXE转PHP:实现功能扩展的有效策略随着互联网的发展,越来越多的应用程序开始向web化迁移,以实现更大范围的用户访问和更便捷的操作。在这个过程中,将原本以EXE(执行文件)方式运行的功能转化为PHP脚本的需求也在逐渐增加。本文将探讨如何将EXE转换为PHP来实现功能扩展,同时给出具体的代码示例。为什么将EXE转换为PHP跨平台性:PHP是一种跨平台的语言

目录Astar Dapp 质押原理质押收益 拆解潜在空投项目:AlgemNeurolancheHealthreeAstar Degens DAOVeryLongSwap 质押策略 & 操作“AstarDapp质押”今年初已升级至V3版本,对质押收益规则做了不少调整。目前首个质押周期已结束,第二质押周期的“投票”子周期刚开始。要获取“额外奖励”收益,需把握此关键阶段(预计持续至6月26日,现余不到5天)。我将细致拆解Astar质押收益,

2010年开始正式接触Linux,入门发行版是Ubuntu10.10,后来过渡到Ubunu11.04,这其中也尝试了很多其他主流的发行版。进入实验室之后,开始用CentOS5,然后是CentOS6,现在进化到CentOS7。使用了四年的Linux,前三年都是在瞎折腾,浪费了不少时间,也得到了不少经验与教训。现在可能是真的老了,已经不愿意折腾了,只希望配置好一个系统之后,就一直使用下去。为什么要写/读这一篇使用Linux尤其是CentOS会遇到一些坑,或是一些有洁癖的人不能忍的事情:官方源中的软件

MyBatis缓存策略解析:一级缓存与二级缓存的最佳实践在使用MyBatis进行开发时,我们经常需要考虑缓存策略的选择。MyBatis中的缓存主要分为一级缓存和二级缓存两种。一级缓存是SqlSession级别的缓存,而二级缓存是Mapper级别的缓存。在实际应用中,合理地使用这两种缓存是提高系统性能的重要手段。本文将通过具体的代码示例来解析MyBatis中一

PHP博客系统的用户反馈与改进策略引言:随着互联网的普及和发展,博客已成为人们分享自己知识和经验的重要途径。为了满足用户的需求,开发一个稳定、易用、功能全面的博客系统至关重要。然而,随着软件的不断迭代,用户的反馈和建议变得尤为重要,因为它们可以帮助我们发现系统的问题并改进系统。本文将讨论PHP博客系统的用户反馈与改进策略,并通过代码示例阐述改进的步骤和方法。

win7的密码策略关系着我们的密码格式、密码需要的字符等,如果我们设置的密码策略太过复杂,可能会让我们在使用密码时非常麻烦,但是也会让我们的密码更难被入侵,那么win7如何更改密码策略呢?下面就一起来看一下吧。win7密码策略更改教程1、键盘按下“win+r”打开运行,输入“gpedit.msc”2、回车确定之后进入本地组策略编辑器。3、根据图示路径找到“账户策略”4、双击打开右侧的“密码策略”5、接着就能在右边设置这些密码策略了。(双击打开即可编辑)6、设置完成之后我们可以看到整体的密码策略。

JavaMap是一个基于键值对的数据结构,它允许开发人员快速存储和检索数据。Map的键可以是任何对象,而值可以是任何类型的数据。Map中每个键最多只能与一个值相关联,如果对同一个键设置多个值,则只会保留最后设置的值。Map有两种主要实现:HashMap:使用散列表来存储键值对。HashMap的性能取决于散列表的实现方式,在大多数情况下,HashMap的性能优于TreeMap。TreeMap:使用红黑树来存储键值对。TreeMap的性能与HashMap相似,但是在某些情况下,TreeMap的性能可
