今天就跟大家聊聊有關(guān)MySQL中臨時表如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、平壩網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
MySQL如何使用臨時表
【臨時表存儲】
MySQL臨時表分為“內(nèi)存臨時表”和“磁盤臨時表”,其中內(nèi)存臨時表使用MySQL的MEMORY存儲引擎,磁盤臨時表使用MySQL的MyISAM存儲引擎;
一般情況下,MySQL會先創(chuàng)建內(nèi)存臨時表,但內(nèi)存臨時表超過配置指定的值后,MySQL會將內(nèi)存臨時表導(dǎo)出到磁盤臨時表。 www.2cto.com
【使用臨時表的場景】
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關(guān)鍵字
ORDERY BY DISTINCT(price)
4)SELECT語句中指定了SQL_SMALL_RESULT關(guān)鍵字
SQL_SMALL_RESULT的意思就是告訴MySQL,結(jié)果會很小,請直接使用內(nèi)存臨時表,不需要使用索引排序
SQL_SMALL_RESULT必須和GROUP BY、DISTINCT或DISTINCTROW一起使用
一般情況下,我們沒有必要使用這個選項,讓MySQL服務(wù)器選擇即可。
【直接使用磁盤臨時表的場景】
1)表包含TEXT或者BLOB列;
2)GROUP BY 或者 DISTINCT 子句中包含長度大于512字節(jié)的列;
3)使用UNION或者UNION ALL時,SELECT子句中包含大于512字節(jié)的列;
www.2cto.com
【臨時表相關(guān)配置】
tmp_table_size:指定系統(tǒng)創(chuàng)建的內(nèi)存臨時表最大大小;
http://dev..com/doc/refman/5.1/en/server-system-variables.html#sysvar_tmp_table_size
max_heap_table_size: 指定用戶創(chuàng)建的內(nèi)存表的最大大?。?/p>
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_heap_table_size
注意:最終的系統(tǒng)創(chuàng)建的內(nèi)存臨時表大小是取上述兩個配置值的最小值。
【表的設(shè)計原則】
使用臨時表一般都意味著性能比較低,特別是使用磁盤臨時表,性能更慢,因此我們在實際應(yīng)用中應(yīng)該盡量避免臨時表的使用。
如果實在無法避免,也應(yīng)該盡量避免使用磁盤臨時表。
常見的方法有:
1)創(chuàng)建索引:在ORDER BY或者GROUP BY的列上創(chuàng)建索引,這樣可以避免使用臨時表;
2)分拆很長的列,可以避免使用磁盤臨時表:一般情況下,TEXT、BLOB,大于512字節(jié)的字符串,基本上都是為了顯示信息,而不會用于查詢條件,因此表設(shè)計的時候,應(yīng)該將這些列獨立到另外一張表。 www.2cto.com
【如何判斷使用了臨時表】
使用explain查看執(zhí)行計劃,Extra列看到Using temporary就意味著使用了臨時表。
看完上述內(nèi)容,你們對MySQL中臨時表如何使用有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。