mysql 临时表_第05问:MySQL 在处理临时结果集时,内部临时表会使用多少内存?...
問(wèn)題:
MySQL 在處理臨時(shí)結(jié)果集(UNION 運(yùn)算 / 聚合運(yùn)算等)時(shí),會(huì)用到內(nèi)部臨時(shí)表(internal temporary table)。
那么內(nèi)部臨時(shí)表會(huì)使用多少內(nèi)存呢?
實(shí)驗(yàn):
我們先創(chuàng)建一個(gè)測(cè)試用的數(shù)據(jù)庫(kù),
然后準(zhǔn)備好數(shù)據(jù),
我們使用一個(gè)帶 UNION 的子表,使執(zhí)行計(jì)劃會(huì)使用內(nèi)部臨時(shí)表:
可以看到執(zhí)行計(jì)劃確實(shí)使用了臨時(shí)表:
下面我們另起一個(gè) session,用 performance_schema 對(duì)內(nèi)存進(jìn)行觀察:
在主 session 中,探查其連接號(hào),并找到線程號(hào):
在 performance_schema 中,確認(rèn)其內(nèi)存分配的統(tǒng)計(jì)初始狀態(tài):
在主 session 中執(zhí)行 SQL:
在 performance_schema 中,查看其內(nèi)存分配:
可知在這個(gè) SQL 的處理過(guò)程中,總共分配了 4M 多的內(nèi)存用于內(nèi)部臨時(shí)表:
我們都知道內(nèi)存臨時(shí)表是 memory(heap) 引擎格式的表,那我們手工建一個(gè)顯式的內(nèi)存表,應(yīng)當(dāng)和內(nèi)存臨時(shí)表使用的內(nèi)存相同,來(lái)試驗(yàn)一下。
在主 session 中創(chuàng)建一張內(nèi)存表,將數(shù)據(jù)插入到內(nèi)存表中:
觀察 performance_schema 可知:內(nèi)存表駐留在內(nèi)存里的字節(jié)數(shù)與之前臨時(shí)表使用的字節(jié)數(shù)相同。
結(jié)論
我們通過(guò) performance_schema 觀察了 memory 引擎的內(nèi)存分配,由此推算了內(nèi)部臨時(shí)表的內(nèi)存占用情況。
MySQL 在其他元數(shù)據(jù)中,諸如 information_schema.INNODB_TEMP_TABLE_INFO 中,并不展示內(nèi)部臨時(shí)表的信息,如圖:
另外值得注意的是:memory 引擎會(huì)多劃分出不少空間,比如本例中我們的數(shù)據(jù)是 300025 行 * 4 字節(jié) =~ 1.2M,而引擎分出了 4M 多的內(nèi)存來(lái)進(jìn)行存儲(chǔ)。
因此如果進(jìn)行估算時(shí),需要將數(shù)據(jù)量乘以一個(gè)較大的系數(shù),才能準(zhǔn)確估算。
小貼士:
我們是第二次用到了 dbdeployer,介紹一下其身世:
dbdeployer 的前身是著名的 mysql-sandbox,是著名博主 Giuseppe Maxia 的扛鼎之作(http://datacharmer.blogspot.com),可以極其方便地搭建 MySQL 多種架構(gòu)的測(cè)試環(huán)境,命令簡(jiǎn)單優(yōu)雅。
今后在實(shí)驗(yàn)中,我們會(huì)多次用到 dbdeployer,或者使用 MySQL 容器進(jìn)行快速搭建和試驗(yàn)。
關(guān)于 MySQL 的技術(shù)內(nèi)容,你們還有什么想知道的嗎?趕緊留言告訴小編吧!
總結(jié)
以上是生活随笔為你收集整理的mysql 临时表_第05问:MySQL 在处理临时结果集时,内部临时表会使用多少内存?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网格合并之后物体的位置改变了_基于网格映
- 下一篇: linux cmake编译源码,linu