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 後的集合所進行的篩選。
綜上: 先 執行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'
四、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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

使用 Navicat Premium 創建數據庫:連接到數據庫服務器並輸入連接參數。右鍵單擊服務器並選擇“創建數據庫”。輸入新數據庫的名稱和指定字符集和排序規則。連接到新數據庫並在“對象瀏覽器”中創建表。右鍵單擊表並選擇“插入數據”來插入數據。

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

可在 Navicat 中通過以下步驟新建 MySQL 連接:打開應用程序並選擇“新建連接”(Ctrl N)。選擇“MySQL”作為連接類型。輸入主機名/IP 地址、端口、用戶名和密碼。 (可選)配置高級選項。保存連接並輸入連接名稱。

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。
