Linux數據庫MySQL內部臨時表策略
MySQL內部臨時表的使用有一定的策略,從源碼中關於SQL查詢是否需要內部臨時表。可以總結如下:
1、DISTINCT查詢,但是簡單的INCT查詢,比如對primary key、unique key等DISTINCT查詢時,查詢優化器會將DISTINCT條件優化,去除DISTINCT條件,也不會創建臨時表;
2、不是第一個表的字段使用ORDER BY 或者GROUP BY;
3、ORDER BY和GROUP BY使用不同的順序;
4、用户需要緩存結果;
5、ROLLUP查詢。
源碼如下所示
代碼地址:sql_, 函數:JOIN::optimize(),位置:sql_
/*
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 distincts 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))) ||
( e != ROLLUP:: STATE_NONE && select_distinct ));
內部臨時表使用原則
但是使用了內部臨時表,那麼他是怎麼存儲的呢?原則是這樣的:
1、當查詢結果較小的情況下,使用heap存儲引擎進行存儲。也就是説在內存中存儲查詢結果。
2、當查詢結果較大的情況下,使用myisam存儲引擎進行存儲。
3、當查詢結果最初較小,但是不斷增大的情況下,將會有從heap存儲引擎轉化為myisam存儲引擎存儲查詢結果。
什麼情況算是查詢結果較小呢?從源碼中if的幾個參數可以看出:
1、有blob字段的情況;
2、使用唯一限制的情況;
3、當前表定義為大表的情況;
4、查詢結果的選項為小結果集的情況;
5、查詢結果的選項為強制使用myisam的情況。
-
Linux中正則表達式使用方法
在Linux系統中使用grep、awk和sed命令時,需要使用正則表達式。那麼正則表達式的使用方法有哪些?跟yjbys小編一起來看看吧!比如我通過grep找代碼編譯結果中是否有錯誤。或者是否有我代碼的錯誤。這裏説下正則表達式基本的應用:•匹配行首與行尾。•匹配數...
-
Linux技巧總結
1、處理特殊的文件名假設Linux系統中有一個文件名叫-aaa,如果我們想對它進行操作,例如現在要刪除它,如果我們按照一般的刪除方法在命令行中輸入rm-aaa命令,界面將會提示我們是無效選項(invalidoption),原來由於文件名的第一個字符為-,Linux把文件名當作選項了,我們可...
-
Centreon的依賴安裝
centreon是開源的IT監控軟件,由法國人於2003年開發,最初名為Oreon,並於2005年正式更名為centreon。下面小編準備了關於Centreon依賴安裝的文章,提供給大家參考!一、Centreon依賴安裝介紹Centreon的安裝有一定的複雜性,對操作系統庫依賴較多,在安裝方式上有源碼編譯安...
-
Linux認證基礎知識:php相對路徑和絕對路徑
在不斷注重大學聯考能力提高的同時,尤其是Linux認證備考的'後階段,我們選擇的是求準求穩求規範。此複習輔導不等於題海戰術,而是要積累實戰經驗,解決掉一些考場失誤等問題。一個好的php代碼,無論放到windows還是linux,不同版本的php上,都能正確的輸出結果,才是一個好代碼...