最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql查詢優(yōu)化之IN子查詢優(yōu)化方法詳解

 更新時間:2023年02月09日 14:36:32   作者:云深n不知處  
項目中有需要,使用MySQL的in子查詢,查詢符合in子查詢集合中條件的數(shù)據(jù),但是沒想到的是,MySQL的in子查詢會如此的慢,讓人無法接受,下面這篇文章主要給大家介紹了關于Mysql查詢優(yōu)化之IN子查詢優(yōu)化的相關資料,需要的朋友可以參考下

物化表

首先提出一個不相關的IN子查詢

SELECT * FROM s1 
 WHERE key1 IN (SELECT common_field FROM s2 WHERE key3 = 'a');

對于不相關的 IN 子查詢來說,如果子查詢的結果集中的記錄條數(shù)很少,那么把子查詢和外層

查詢分別看成兩個單獨的單表查詢效率還是蠻高的,但是如果單獨執(zhí)行子查詢后的結果集太多的話,就會導致這
些問題:

  • 結果集太多,可能內存中都放不下~
  • 對于外層查詢來說,如果子查詢的結果集太多,那就意味著 IN 子句中的參數(shù)特別多,這就導致:

無法有效的使用索引,只能對外層查詢進行全表掃描。
在對外層查詢執(zhí)行全表掃描時,由于 IN 子句中的參數(shù)太多,這會導致檢測一條記錄是否符合和 IN 子句中的參數(shù)匹配花費的時間太長。
比如說 IN 子句中的參數(shù)只有兩個:
SELECT * FROM tbl_name WHERE column IN (a, b);
這樣相當于需要對 tbl_name 表中的每條記錄判斷一下它的 column 列是否符合 column = a OR column= b 。在 IN 子句中的參數(shù)比較少時這并不是什么問題,如果 IN 子句中的參數(shù)比較多時,比如這樣:
SELECT * FROM tbl_name WHERE column IN (a, b, c …, …);
那么這樣每條記錄需要判斷一下它的 column 列是否符合 column = a OR column = b OR column = c
OR … ,這樣性能耗費可就多了。

所以提出一個解決方案:不直接將不相關子查詢的結果集當作外層查詢的參數(shù),而是將該結果集寫入一個臨時表里。

臨時表的特性:

  1. 該臨時表的列就是子查詢結果集中的列。
  2. 寫入臨時表的記錄會被去重。
  3. 一般情況下子查詢結果集不會大的離譜,所以會為它建立基于內存的使用 Memory 存儲引擎的臨時表,而且會為該表建立哈希索引。
  4. 如果子查詢的結果集非常大,超過了系統(tǒng)變量 tmp_table_size 或者 max_heap_table_size ,臨時表會轉而
    使用基于磁盤的存儲引擎來保存結果集中的記錄,索引類型也對應轉變?yōu)?B+ 樹索引。
    這個將子查詢結果集中的記錄保存到臨時表的過程稱之為 物化。

物化表轉連接

當我們把子查詢進行物化之后,假設子查詢物化表的名稱為 materialized_table ,該物化表存儲的子查詢結果集的列為 m_val ,那么這個查詢其實可以從下邊兩種角度來看待:

SELECT * FROM s1
WHERE key1 IN (SELECT common_field FROM s2 WHERE key3 = ‘a');

從表 s1 的角度來看待,整個查詢的意思其實是:對于 s1 表中的每條記錄來說,如果該記錄的 key1 列的值

在子查詢對應的物化表中,則該記錄會被加入最終的結果集。畫個圖表示一下就是這樣:

從子查詢物化表的角度來看待,整個查詢的意思其實是:對于子查詢物化表的每個值來說,如果能在 s1 表
中找到對應的 key1 列的值與該值相等的記錄,那么就把這些記錄加入到最終的結果集。

也就是說其實上邊的查詢就相當于表 s1 和子查詢物化表 materialized_table 進行內連接:

SELECT s1.* FROM s1 INNER JOIN materialized_table ON key1 = m_val;

如果使用 s1 表作為驅動表的話,總查詢成本由下邊幾個部分組成:

  1. 物化子查詢時需要的成本
  2. 掃描 s1 表時的成本
  3. s1表中的記錄數(shù)量 × 通過 m_val = xxx 對 materialized_table 表進行單表訪問的成本(物化表中的記錄是不重復的,并且為物化表中的列建立了索引,所以這個步驟顯然是非??斓模?。

如果使用 materialized_table 表作為驅動表的話,總查詢成本由下邊幾個部分組成:

  1. 物化子查詢時需要的成本
  2. 掃描物化表時的成本
  3. 物化表中的記錄數(shù)量 × 通過 key1 = xxx 對 s1 表進行單表訪問的成本

總結

到此這篇關于Mysql查詢優(yōu)化之IN子查詢優(yōu)化方法的文章就介紹到這了,更多相關Mysql IN子查詢優(yōu)化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql5.1.26安裝配置方法詳解

    mysql5.1.26安裝配置方法詳解

    這篇文章主要為大家詳細介紹了mysql安裝配置方法,圖文詳解MySQL5.1.26安裝步驟,感興趣的小伙伴們可以參考一下
    2016-06-06
  • MySQL性能分析及explain的使用說明

    MySQL性能分析及explain的使用說明

    本文我們主要介紹了MySQL性能分析以及explain的使用,包括:組合索引、慢查詢分析、MYISAM和INNODB的鎖定、MYSQL的事務配置項等,希望能夠對您有所幫助。
    2011-08-08
  • PHP MYSQL注入攻擊需要預防7個要點

    PHP MYSQL注入攻擊需要預防7個要點

    這篇文章主要介紹了PHP MYSQL開發(fā)中,對于注入攻擊需要預防的7個要點,大家需要注意了
    2013-11-11
  • mysql 8.0.16 winx64.zip安裝配置方法圖文教程

    mysql 8.0.16 winx64.zip安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 8.0.16 winx64.zip安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Mysql分片,大數(shù)據(jù)量時擴容解決方案

    Mysql分片,大數(shù)據(jù)量時擴容解決方案

    這篇文章主要介紹了Mysql分片,大數(shù)據(jù)量時擴容解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • MySQL刪除表的三種方式(小結)

    MySQL刪除表的三種方式(小結)

    這篇文章主要介紹了MySQL刪除表的三種方式(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • MySQL存儲引擎基礎知識

    MySQL存儲引擎基礎知識

    本篇文章主要給大家講述了MySQL存儲引擎相關基礎知識,有助于大家對MySQL存儲引擎有更好的理解,學習下吧。
    2017-12-12
  • MySQL中在查詢結果集中得到記錄行號的方法

    MySQL中在查詢結果集中得到記錄行號的方法

    這篇文章主要介紹了MySQL中在查詢結果集中得到記錄行號的方法,本文解決方法是通過預定義用戶變量來實現(xiàn),需要的朋友可以參考下
    2015-01-01
  • MySql command line client命令操作大全

    MySql command line client命令操作大全

    這篇文章主要介紹了MySql command line client命令操作大全,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • MySQL雙主搭建+keepalived高可用的實現(xiàn)

    MySQL雙主搭建+keepalived高可用的實現(xiàn)

    本文主要介紹了MySQL雙主搭建+keepalived高可用的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04

最新評論

三穗县| 辽宁省| 福安市| 天峨县| 蒙城县| 洛宁县| 新兴县| 五莲县| 乐都县| 泸水县| 思南县| 紫金县| 七台河市| 荣昌县| 定边县| 格尔木市| 古交市| 勃利县| 科技| 丹江口市| 廉江市| 偏关县| 应城市| 湘西| 四川省| 巴彦县| 察隅县| 大田县| 萨嘎县| 句容市| 聊城市| 怀化市| 通江县| 秦安县| 昌图县| 集安市| 北安市| 凤城市| 新郑市| 东兰县| 宁陵县|