搜尋
首頁資料庫mysql教程mysql的join查詢和多次查詢方法是什麼

    join查詢與多次查詢比較

    #MySQL多表關聯查詢效率高點還是多次單表查詢效率高?

    在資料量不夠大的時候,用join沒有問題,但一般都會拉到service層上去做

    第一:單機資料庫運算資源很貴,資料庫同時要服務寫和讀,都需要消耗CPU,為了能讓資料庫的吞吐變得更高,而業務又不在乎那幾百微妙到毫秒級的延時差距,業務會把更多計算放到service層做,畢竟運算資源很好水平擴展,資料庫很難啊,所以大多數業務會把純運算操作放到service層做,而將資料庫當成一種帶事務能力的kv系統來使用,這是一種重業務,輕DB的架構思路

    第二:許多複雜的業務可能會因為發展的歷史原因,一般不會只用一種資料庫,一般會在多個資料庫上加一層中間件,多個資料庫之間就沒辦法join了,自然業務會抽像出一個service層,降低對資料庫的耦合。

    第三:對於一些大型公司由於資料規模龐大,不得不對資料庫進行分庫分錶,對於分庫分錶的應用,使用join也受到了很多限制,除非業務能夠很好的根據sharding key明確要join的兩個表在同一個實體函式庫。而中間件一般對跨庫join都支援不好。

    舉一個很常見的業務例子,在分庫分錶中,要同步更新兩個表,這兩個表位於不同的物理庫中,為了保證資料一致性,一種做法是透過分散式事務中間件將兩個更新操作放到一個事務中,但這樣的操作一般要加全域鎖,效能很捉急,而有些業務能夠容忍短暫的資料不一致,怎麼做?讓它們分別更新唄,但是會存在資料寫失敗的問題,那就起個定時任務,掃描下A表有沒有失敗的行,然後看看B表是不是也沒寫成功,然後對這兩條關聯記錄做訂正,這時候同樣沒辦法用join去實現,只能將資料拉到service層應用自己來合併了。 。 。

    事實上,以分解關聯查詢的方式重構查詢具有以下優點:

    讓快取的效率更高。

    許多應用程式可以方便地快取單表查詢對應的結果物件。另外對於MySQL的查詢快取來說,如果關聯中的某個表發生了變化,那麼就無法使用查詢快取了,而拆分後,如果某個表很少改變,那麼基於該表的查詢就可以重複利用查詢快取結果了。

    將查詢分解後,執行單一查詢可以減少鎖定的競爭。

    在應用程式層做關聯,可以更容易對資料庫進行拆分,更容易做到高效能和可擴展。

    查詢本身效率也可能會有所提升

    可以減少冗餘記錄的查詢。

    更進一步,這樣做相當於在應用中實作了雜湊關聯,而不是使用MySQL的巢狀環關聯,某些場景雜湊關聯的效率更高很多。

    查詢語句join、on、where執行順序

    MySQL 的執行順序

    一、典型SELECT語句完整的執行順序

    1)from子句組裝來自不同資料來源的資料;

    2)使用on進行join連接的資料篩選

    3)where子句基於指定的條件對記錄行進行篩選;

    4) group by子句將資料分割為多個分組;

    5)cube,rollup

    6)使用聚集函數計算;

    7)使用having子句篩選分組;

    8)計算所有的表達式;

    9)計算select的欄位;

    10)使用distinct 進行資料去重

    #11)使用order by對結果集進行排序。

    12)選擇TOPN的資料

    二、from

    如果是採用的關聯from tableA, tableB ,這2個表格會先組織進行笛卡爾積,然後在進行下面的where、group by 等操作。

    三、on

    如果使用left join, inner join 或 outer full join的時候,使用on 進行條件篩選後,在進行join。

    看下面的2個sql 和結果。這兩者的差異在於它們在on和where語句位置之後的差異。首先使用 on 進行條件篩選,接著執行 join 操作,在這之後再應用 where 條件篩選。

    使用join先進行連接,接著使用on進行篩選,會形成笛卡爾積。這樣的left join 和 直連接 沒有任何的差別。所以肯定是先on 條件篩選後,在進行join。 如果在WHERE之後,在ON之上,進行JOIN操作,下面這兩個SQL查詢的結果應該會相同。由此可見,where是針對 join 後的集合所進行的篩選。

    mysql的join查詢和多次查詢方法是什麼 綜上: 先 執行on 條件篩選, 在進行join, 最後進行where 篩選

    ###
    SELECT DISTINCT a.domain , b.domain
    FROM mal_nxdomains_raw a
    LEFT JOIN mal_nxdomains_detail b ON a.domain = b.domain AND b.date = ‘20160403'
    WHERE a.date = ‘20160403'
    ##########
    SELECT DISTINCT a.domain , b.domain
    FROM mal_nxdomains_raw a
    LEFT JOIN mal_nxdomains_detail b ON a.domain = b.domain #and b.date = ‘20160403'
    WHERE a.date = ‘20160403'
    AND b.date = ‘20160403'

    mysql的join查詢和多次查詢方法是什麼

    四、on 条件与where 条件

    1、使用位置

    • on 条件位置在join后面

    • where 条件在join 与on完成的后面

    2、使用对象

    • on 的使用对象是被关联表

    • where的使用对象可以是主表,也可以是关联表

    3、选择与使用

    主表条件筛选:只能在where后面使用。

    被关联表,如果是想缩小join范围,可以放置到on后面。如果是关联后再查询,可以放置到where 后面。

    如果left join 中,where条件有对被关联表的 关联字段的 非空查询,与使用inner join的效果后,在进行where 筛选的效果是一样的。不能起到left join的作用。

    五、join 流程

    在表A和表B的联接中,从A表中选出一条记录,并将其传递到B表进行扫描和匹配。所以A的行数决定查询次数,B表的行数决定扫描范围。需要运行100次从A表中取出一条数据,然后进行200次比对,将结果存储到B表中。

    相对来说从A表取数据消耗的资源比较多。所以尽量tableA选择比较小的表。同时缩小B表的查询范围。

    但是实际应用中,因为二者返回的数据结果不同,使用的索引也不同,导致条件放置在on 和 where 效率是不一定谁更好。要根据需求来确定。

    以上是mysql的join查詢和多次查詢方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

    mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

    在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

    mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

    mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

    mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

    方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

    mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

    转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

    MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

    带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

    mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

    在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    AI Hentai Generator

    AI Hentai Generator

    免費產生 AI 無盡。

    熱門文章

    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    2 週前By尊渡假赌尊渡假赌尊渡假赌
    倉庫:如何復興隊友
    4 週前By尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island冒險:如何獲得巨型種子
    4 週前By尊渡假赌尊渡假赌尊渡假赌

    熱工具

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript開發工具

    MinGW - Minimalist GNU for Windows

    MinGW - Minimalist GNU for Windows

    這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    Atom編輯器mac版下載

    Atom編輯器mac版下載

    最受歡迎的的開源編輯器

    SublimeText3 英文版

    SublimeText3 英文版

    推薦:為Win版本,支援程式碼提示!