浅谈Mysql在什么情况下会使用内部临时表


union鎵ц

涓轰簡渚夸簬鍒嗘瀽锛屼娇鐢ㄤ竴涓媠ql鏉ヨ繘琛屼妇渚?br />

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 ( );

鐒跺悗鎴戜滑鎵ц浠ヤ笅sql

(select 1000 as f) union (select id from t1 order by id desc limit 2);

杩欐sql鐨勮涔夋槸锛屽彇涓や釜瀛愭煡璇㈢殑鐨勫苟闆嗭紝骞朵笖鍘婚噸

鍙互鐪嬪埌锛岀浜岃鐨刱ey鏄痯rimary锛岃鏄庣浜屼釜瀛愭煡璇娇鐢ㄧ储寮昳d銆傜涓夎鐨凟xtra瀛楁锛岃〃绀哄湪瀛愭煡璇nion鐨勬椂鍊欙紝浣跨敤浜嗕复鏃惰〃锛圲sing temporary锛夈?br /> 杩欎釜璇彞鐨勬墽琛屾祦绋嬫槸杩欐牱鐨勶細
1锛夊垱寤轰竴涓唴瀛樹复鏃惰〃锛岃繖涓复鏃惰〃鍙湁涓涓暣褰㈠瓧娈礷锛屽苟涓攆鏄富閿瓧娈?br /> 2锛夋墽琛岀涓涓瓙鏌ヨ锛屽皢1000瀛樺湪涓存椂琛?br /> 3锛夋墽琛岀浜屼釜瀛愭煡璇紝鎷垮埌绗竴琛宨d=1000锛屽苟璇曞浘鎻掑叆鍒颁复鏃惰〃锛屼絾鏄敱浜?000杩欎釜鍊煎凡缁忓瓨鍦ㄤ复鏃惰〃浜嗭紝杩濇硶浜嗗敮涓鎬х害鏉燂紝鎵浠ユ彃鍏ュけ璐ワ紝鎺ョ潃鍙栧埌绗簩琛屾暟鎹?99锛屾彃鍏ヤ复鏃惰〃鎴愬姛
4锛変粠涓存椂琛ㄤ腑鎸夎鍙栧嚭鏁版嵁锛岃繑鍥炵粨鏋滐紝骞跺垹闄や复鏃惰〃锛岀粨鏋滀腑鍖呭惈涓ゆ潯鏁版嵁灏辨槸1000鍜?99
鍙互鐪嬪埌锛屼复鏃惰〃璧峰埌浜嗘殏瀛樻暟鎹殑浣滅敤锛岃屼笖瀛樺湪鍞竴鎬х害鏉燂紝瀹炵幇浜唘nion鍘婚噸鐨勮涔?br />

group by

鍙﹀涓涓父瑙佺殑浣跨敤涓存椂琛ㄧ殑渚嬪瓙灏辨槸group by锛屾垜浠湅涓涓嬩互涓媠ql

select id%10 as m, count(*) as c from t1 group by m;

杩欎釜璇彞灏辨槸鏍规嵁t1琛ㄧ殑鏁版嵁锛屾牴鎹甶d%10杩涜鍒嗙粍锛屽苟鎸夌収m鐨勭粨鏋滄帓搴忓悗杈撳嚭

鍦‥xtra瀛楁涓紝鎴戜滑鐪嬪埌浜嗕笁涓俊鎭細

1锛塙sing index锛岃〃绀鸿繖涓鍙ヤ娇鐢ㄤ簡瑕嗙洊绱㈠紩锛岄夋嫨浜嗙储寮?a锛?br /> 2锛塙sing temporary锛岃〃绀轰娇鐢ㄤ簡涓存椂琛紱
3锛塙sing filesort锛岃〃绀洪渶瑕佹帓搴忥紱

杩欎釜璇彞鐨勬墽琛屾祦绋嬫槸杩欐牱鐨勶細

1锛夊垱寤哄唴瀛樹复鏃惰〃锛岃〃閲屾湁瀛楁m鍜宑锛屼富閿槸m锛?br /> 2锛夋壂鎻忚〃t1鐨勭储寮昦锛屼緷娆″彇鍑哄彾瀛愯妭鐐逛笂闈㈢殑id鍊硷紝璁$畻id%10鐨勭粨鏋滐紝璁颁负x锛?/p>

  • 濡傛灉涓存椂琛ㄦ病鏈変富閿畑锛屽氨鎻掑叆涓涓褰曪紙x,1锛夛紱
  • 濡傛灉琛ㄤ腑鏈変富閿畑鐨勮锛屽氨灏唜杩欎竴琛岀殑c鍊煎姞1锛?/li>

3锛夐亶鍘嗗畬鎴愪箣鍚庯紝鍐嶆牴鎹瓧娈祄鍋氭帓搴忥紝寰楀埌缁撴灉

鍐呭瓨涓存椂琛ㄧ殑澶у皬鏄湁闄愬埗鐨勶紝鍙傛暟tmp_table_size灏辨槸鎺у埗杩欎釜鍐呭瓨澶у皬鐨勶紝榛樿鏄?6M锛屽鏋滃唴瀛樹复鏃惰〃澶у皬杈惧埌浜嗕笂绾匡紝杩欐椂鍊欏氨浼氭妸鍐呭瓨涓存椂琛ㄨ浆鎴愮鐩樹复鏃惰〃锛岀鐩樹复鏃惰〃鐨勯粯璁ゅ紩鎿庢槸InnoDB锛屽鏋滆〃鐨勬暟鎹噺寰堝ぇ锛屽緢鍙兘鏌ヨ灏变細鍗犵敤澶ч噺鐨勭鐩樼┖闂?br />

鍒版杩欑瘒鍏充簬娴呰皥Mysql鍦ㄤ粈涔堟儏鍐典笅浼氫娇鐢ㄥ唴閮ㄤ复鏃惰〃鐨勬枃绔犲氨浠嬬粛鍒拌繖浜?鏇村鐩稿叧Mysql 鍐呴儴涓存椂琛ㄥ唴瀹硅鎼滅储鑴氭湰涔嬪浠ュ墠鐨勬枃绔犳垨缁х画娴忚涓嬮潰鐨勭浉鍏虫枃绔犲笇鏈涘ぇ瀹朵互鍚庡澶氭敮鎸佽剼鏈箣瀹讹紒