MySQL内部临时表的具体使用 |
UNIONUNION璇箟锛氬彇涓や釜瀛愭煡璇㈢粨鏋滅殑骞堕泦锛岄噸澶嶇殑琛屽彧淇濈暀涓琛?/p> 琛ㄥ垵濮嬪寲CREATE TABLE t1(id INT PRIMARY KEY, a INT, b INT, INDEX(a)); DELIMITER ;; CREATE PROCEDURE idata() BEGIN DECLARE i INT; SET i=1; WHILE (i<= 1000) DO INSERT INTO t1 VALUES (i,i,i); SET i=i+1; END WHILE; END;; DELIMITER ; CALL idata(); 鎵ц璇彞(SELECT 1000 AS f) UNION (SELECT id FROM t1 ORDER BY id DESC LIMIT 2); mysql> EXPLAIN (SELECT 1000 AS f) UNION (SELECT id FROM t1 ORDER BY id DESC LIMIT 2); +----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+ | 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used | | 2 | UNION | t1 | NULL | index | NULL | PRIMARY | 4 | NULL | 2 | 100.00 | Backward index scan; Using index | | NULL | UNION RESULT | <union1,2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary | +----+--------------+------------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+ 绗簩琛岀殑
UNION RESULT
UNION ALL
mysql> EXPLAIN (SELECT 1000 AS f) UNION ALL (SELECT id FROM t1 ORDER BY id DESC LIMIT 2); +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+ | 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used | | 2 | UNION | t1 | NULL | index | NULL | PRIMARY | 4 | NULL | 2 | 100.00 | Backward index scan; Using index | +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+ GROUP BY鍐呭瓨鍏呰冻-- 16777216 Bytes = 16 MB mysql> SHOW VARIABLES like '%tmp_table_size%'; +----------------+----------+ | Variable_name | Value | +----------------+----------+ | tmp_table_size | 16777216 | +----------------+----------+ 鎵ц璇彞-- MySQL 5.6涓婃墽琛? mysql> EXPLAIN SELECT id%10 AS m, COUNT(*) AS c FROM t1 GROUP BY m; +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------+ | 1 | SIMPLE | t1 | index | PRIMARY,a | a | 5 | NULL | 1000 | Using index; Using temporary; Using filesort | +----+-------------+-------+-------+---------------+------+---------+------+------+----------------------------------------------+ mysql> SELECT id%10 AS m, COUNT(*) AS c FROM t1 GROUP BY m; +------+-----+ | m | c | +------+-----+ | 0 | 100 | | 1 | 100 | | 2 | 100 | | 3 | 100 | | 4 | 100 | | 5 | 100 | | 6 | 100 | | 7 | 100 | | 8 | 100 | | 9 | 100 | +------+-----+
鎵ц杩囩▼
鎺掑簭杩囩▼ORDER BY NULL-- 璺宠繃鏈鍚庣殑鎺掑簭闃舵锛岀洿鎺ヤ粠涓存椂琛ㄤ腑鍙栧洖鏁版嵁 mysql> EXPLAIN SELECT id%10 AS m, COUNT(*) AS c FROM t1 GROUP BY m ORDER BY NULL; +----+-------------+-------+-------+---------------+------+---------+------+------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+------------------------------+ | 1 | SIMPLE | t1 | index | PRIMARY,a | a | 5 | NULL | 1000 | Using index; Using temporary | +----+-------------+-------+-------+---------------+------+---------+------+------+------------------------------+ -- t1涓殑鏁版嵁鏄粠1寮濮嬬殑 mysql> SELECT id%10 AS m, COUNT(*) AS c FROM t1 GROUP BY m ORDER BY NULL; +------+-----+ | m | c | +------+-----+ | 1 | 100 | | 2 | 100 | | 3 | 100 | | 4 | 100 | | 5 | 100 | | 6 | 100 | | 7 | 100 | | 8 | 100 | | 9 | 100 | | 0 | 100 | +------+-----+ 鍐呭瓨涓嶈冻SET tmp_table_size=1024; 鎵ц璇彞-- 鍐呭瓨涓存椂琛ㄧ殑涓婇檺涓?024 Bytes锛屼絾鍐呭瓨涓存椂琛ㄤ笉鑳藉畬鍏ㄦ斁涓?00琛屾暟鎹紝鍐呭瓨涓存椂琛ㄤ細杞垚纾佺洏涓存椂琛紝榛樿閲囩敤InnoDB寮曟搸 -- 濡傛灉t1寰堝ぇ锛岃繖涓煡璇㈤渶瑕佺殑纾佺洏涓存椂琛ㄥ氨浼氬崰鐢ㄥぇ閲忕殑纾佺洏绌洪棿 mysql> SELECT id%100 AS m, count(*) AS c FROM t1 GROUP BY m ORDER BY NULL LIMIT 10; +------+----+ | m | c | +------+----+ | 1 | 10 | | 2 | 10 | | 3 | 10 | | 4 | 10 | | 5 | 10 | | 6 | 10 | | 7 | 10 | | 8 | 10 | | 9 | 10 | | 10 | 10 | +------+----+ 浼樺寲鏂规浼樺寲绱㈠紩涓嶈浣跨敤鍐呭瓨涓存椂琛ㄨ繕鏄鐩樹复鏃惰〃锛?code>GROUP BY閮介渶瑕佹瀯閫犱竴涓甫鍞竴绱㈠紩鐨勮〃锛?em>鎵ц浠d环杈冮珮 闇瑕佷复鏃惰〃鐨勫師鍥狅細姣忎竴琛岀殑 濡傛灉鍙互纭繚杈撳叆鐨勬暟鎹槸鏈夊簭鐨勶紝閭d箞璁$畻
-- MySQL 5.7涓婃墽琛? ALTER TABLE t1 ADD COLUMN z INT GENERATED ALWAYS AS(id % 100), ADD INDEX(z); -- 浣跨敤浜嗚鐩栫储寮曪紝涓嶉渶瑕佷复鏃惰〃锛屼篃涓嶉渶瑕佹帓搴? mysql> EXPLAIN SELECT z, COUNT(*) AS c FROM t1 GROUP BY z; +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | t1 | NULL | index | z | z | 5 | NULL | 1000 | 100.00 | Using index | +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------------+ 2 鐩存帴鎺掑簭涓涓?code>GROUP BY璇彞闇瑕佹斁鍒颁复鏃惰〃鐨勬暟鎹噺鐗瑰埆澶э紝杩樻槸鎸夌収鍏堟斁鍦ㄥ唴瀛樹复鏃惰〃锛屽啀閫鍖栨垚纾佺洏涓存椂琛?/p> 鍙互鐩存帴鐢ㄧ鐩樹复鏃惰〃鐨勫舰寮忥紝鍦?code>GROUP BY璇彞涓?code>SQL_BIG_RESULT锛堝憡璇変紭鍖栧櫒娑夊強鐨勬暟鎹噺寰堝ぇ锛?/p> 纾佺洏涓存椂琛ㄥ師鏈噰鐢˙+鏍戝瓨鍌紝瀛樺偍鏁堢巼杩樹笉濡傛暟缁勶紝浼樺寲鍣ㄧ湅鍒?code>SQL_BIG_RESULT锛屼細鐩存帴鐢ㄦ暟缁勫瓨鍌?/p>
鎵ц杩囩▼-- 娌℃湁鍐嶄娇鐢ㄤ复鏃惰〃锛岃屾槸鐩存帴浣跨敤浜嗘帓搴忕畻娉? mysql> EXPLAIN SELECT SQL_BIG_RESULT id%100 AS m, COUNT(*) AS c FROM t1 GROUP BY m; +----+-------------+-------+-------+---------------+------+---------+------+------+-----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+-----------------------------+ | 1 | SIMPLE | t1 | index | PRIMARY,a | a | 5 | NULL | 1000 | Using index; Using filesort | +----+-------------+-------+-------+---------------+------+---------+------+------+-----------------------------+ 鍒濆鍖?code>sort_buffer锛岀‘瀹氭斁鍏ヤ竴涓暣鍨嬪瓧娈碉紝璁颁负m 鎵弿t1鐨勭储寮昦锛屼緷娆″彇鍑洪噷闈㈢殑id鍊硷紝灏唅d%100鐨勫兼斁鍏?code>sort_buffer 鎵弿瀹屾垚鍚庯紝瀵?code>sort_buffer鐨勫瓧娈祄鍋氭帓搴忥紙sort_buffer鍐呭瓨涓嶅鏃讹紝浼氬埄鐢ㄧ鐩樹复鏃舵枃浠惰緟鍔╂帓搴忥級 鎺掑簭瀹屾垚鍚庯紝寰楀埌涓涓湁搴忔暟缁勶紝閬嶅巻鏈夊簭鏁扮粍锛屽緱鍒版瘡涓煎嚭鐜扮殑娆℃暟锛堢被浼间笂闈紭鍖栫储寮曠殑鏂瑰紡锛?/p> 瀵规瘮DISTINCT-- 鏍囧噯SQL锛孲ELECT閮ㄥ垎娣诲姞涓涓仛鍚堝嚱鏁癈OUNT(*) SELECT a,COUNT(*) FROM t GROUP BY a ORDER BY NULL; -- 闈炴爣鍑哠QL SELECT a FROM t GROUP BY a ORDER BY NULL; SELECT DISTINCT a FROM t; 鏍囧噯SQL锛氭寜鐓у瓧娈礱鍒嗙粍锛岃绠楁瘡缁刟鍑虹幇鐨勬鏁?/p> 闈炴爣鍑哠QL锛氭病鏈変簡
濡傛灉涓嶉渶瑕佹墽琛岃仛鍚堝嚱鏁?锛?code>DISTINCT鍜?code>GROUP BY鐨勮涔夈佹墽琛屾祦绋嬪拰鎵ц鎬ц兘鏄浉鍚岀殑
灏忕粨
鍙傝冭祫鏂?/h2>銆?a target="_blank" href="https://www.jb51.net/books/790640.html">MySQL瀹炴垬45璁?/a>銆?/p> 鍒版杩欑瘒鍏充簬MySQL鍐呴儴涓存椂琛ㄧ殑鍏蜂綋浣跨敤鐨勬枃绔犲氨浠嬬粛鍒拌繖浜?鏇村鐩稿叧MySQL鍐呴儴涓存椂琛ㄥ唴瀹硅鎼滅储鑴氭湰涔嬪浠ュ墠鐨勬枃绔犳垨缁х画娴忚涓嬮潰鐨勭浉鍏虫枃绔犲笇鏈涘ぇ瀹朵互鍚庡澶氭敮鎸佽剼鏈箣瀹讹紒 |