5分鐘了解MySQL5.7中union all用法的黑科技
union all在MySQL5.6下的表現(xiàn)
Part1:MySQL5.6.25
[root@HE1 ~]# MySQL -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.25-log MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select version(); +------------+ | version() | +------------+ | 5.6.25-log | +------------+ 1 row in set (0.26 sec) mysql> explain (select id from helei order by id) union all (select id from t where id=0 order by id); +----+--------------+------------+-------+---------------+--------+---------+------+------+-----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------+------------+-------+---------------+--------+---------+------+------+-----------------+ | 1 | PRIMARY | helei | index | NULL | idx_c1 | 4 | NULL | 5219 | Using index | | 2 | UNION | t | ALL | NULL | NULL | NULL | NULL | 1 | Using where | | NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary | +----+--------------+------------+-------+---------------+--------+---------+------+------+-----------------+ 3 rows in set (0.00 sec)
可以看出,在MySQL5.6版本中,執(zhí)行結(jié)果如下圖所示:
從執(zhí)行計劃來看,是把helei表的查詢結(jié)果和t表的查詢結(jié)果合并在了一張臨時表里,然后輸出給客戶端。
union all在MySQL5.7/MariaDB10.1下的表現(xiàn)
Part1:MySQL5.7.15
[root@HE1 ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 5.7.15-log MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select version(); +------------+ | version() | +------------+ | 5.7.15-log | +------------+ 1 row in set (0.00 sec)、 mysql> explain (select id from helei order by id) union all (select id from t where id=0 order by id); +----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-------------+ | 1 | PRIMARY | helei | NULL | index | NULL | idx_c1 | 4 | NULL | 5212 | 100.00 | Using index | | 2 | UNION | t | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where | +----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-------------+ 2 rows in set, 1 warning (0.00 sec)
可以看出,在MySQL5.7版本中,執(zhí)行結(jié)果如下圖所示:
Part2:MariaDB10.1.16
[root@HE3 ~]# /usr/local/mariadb/bin/mysql -uroot -S /tmp/mariadb.sock Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 7 Server version: 10.1.16-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> MariaDB [helei]> explain (select id from helei order by id) union all (select id from t where id=0 order by id); +------+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ | 1 | PRIMARY | helei | index | NULL | idx_c1 | 4 | NULL | 5198 | Using index | | 2 | UNION | t | ALL | NULL | NULL | NULL | NULL | 1 | Using where | +------+-------------+-------+-------+---------------+--------+---------+------+------+-------------+ 2 rows in set (0.00 sec)
可以看出在MariaDB10.1中,執(zhí)行結(jié)果如下圖所示:
從執(zhí)行結(jié)果看,無論是MySQL5.7還是MariaDB10.1,都沒有創(chuàng)建臨時表,按照順序,helei表的查詢結(jié)果首先輸出到客戶端,然后t表的查詢結(jié)果再輸出到客戶端。
本文中的優(yōu)化只針對union all,對union和在最外層使用order by無效。如下圖是所示:
——總結(jié)——
在MySQL5.7/MariaDB10.1中,union all不再創(chuàng)建臨時表,這樣在聯(lián)合查詢時會減少I/O開銷,在MySQL5.5/5.6中則不具備這一特性。
以上所述是小編給大家介紹的5分鐘了解MySQL5.7中union all用法的黑科技,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別
- MySQL之union和union all的使用及區(qū)別說明
- 簡單聊一聊SQL中的union和union?all
- 帶例子詳解Sql中Union和Union?ALL的區(qū)別
- MySQL系列理解運用union(all)與limit及exists關(guān)鍵字教程
- 簡單了解MySQL union all與union的區(qū)別
- MySQL中UNION與UNION ALL的基本使用方法
- 淺析mysql union和union all
- SQL語句之Union和Union All的用法
- SQL中UNION與UNION ALL的區(qū)別小結(jié)
相關(guān)文章
MySQL事務(wù)(transaction)看這篇就足夠了
M事務(wù)的實現(xiàn)是基于數(shù)據(jù)庫的存儲引擎,不同的存儲引擎對事務(wù)的支持程度不一樣,下面這篇文章主要給大家介紹了關(guān)于MySQL事務(wù)(transaction)的相關(guān)資料,需要的朋友可以參考下2022-11-11MySQL 8.0.13設(shè)置日期為0000-00-00 00:00:00時出現(xiàn)的問題解決
這篇文章主要介紹了MySQL 8.0.13設(shè)置日期為0000-00-00 00:00:00時出現(xiàn)的問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01使用MySQL實現(xiàn)select?into臨時表的功能
這篇文章主要介紹了使用MySQL實現(xiàn)select?into臨時表的功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09mysql-8.0.16 winx64的最新安裝教程圖文詳解
最近剛學(xué)習(xí)數(shù)據(jù)庫,首先是了解數(shù)據(jù)庫是什么,數(shù)據(jù)庫、數(shù)據(jù)表的基本操作,這就面臨了一個問題,mysql的安裝,我這里下載的是64位的,基于Windows的,需要的朋友可以參考下2019-06-06MySQL之權(quán)限以及設(shè)計數(shù)據(jù)庫案例講解
這篇文章主要介紹了MySQL之權(quán)限以及設(shè)計數(shù)據(jù)庫案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08Mysql使用concat函數(shù)實現(xiàn)關(guān)鍵字模糊查詢功能(列表數(shù)據(jù)過濾含前后端代碼)
在我們的平時開發(fā)中經(jīng)常會遇到根據(jù)條件過濾列表數(shù)據(jù)項,今天在做自己項目的時候就遇到了這個問題,正好借著這個機會分享我的思路以及相關(guān)的代碼,對Mysql使用concat函數(shù)實現(xiàn)關(guān)鍵字模糊查詢功能感興趣的朋友一起看看吧2023-02-02CentOS7環(huán)境下MySQL8常用命令小結(jié)
在進行MySQL的優(yōu)化之前必須要了解的就是MySQL的查詢過程,下面這篇文章主要給大家介紹了關(guān)于CentOS7環(huán)境下MySQL8常用命令的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06