很多高效能的應用都會對關聯查詢進行分解。
簡單地,可以對每個表進行一次單錶查詢,然後將結果在應用程式中進行關聯。例如,下面這個查詢:
select
*from tag
join tag_post on tag_post.tag_id = tag.id
join post on tag_post.post_id = post.id
where tag.tag=』mysql』;
可以分解成下面這些查詢來代替:
select
*from tag where tag=』mysql』;
select
*from tag_post where tag_id=
1234
;select
*from post where id in
(123
,456
,567
,9989
,8909
);
到底為什麼要這樣做?
咋一看,這樣做並沒有什麼好處,原本一條查詢,這裡卻變成了多條查詢,返回結果又是一模一樣。
事實上,用分解關聯查詢的方式重構查詢具有如下優勢:
讓快取的效率更高。
許多應用程式可以方便地快取單錶查詢對應的結果物件。另外對於mysql的查詢快取來說,如果關聯中的某個表發生了變化,那麼就無法使用查詢快取了,而拆分後,如果某個表很少改變,那麼基於該錶的查詢就可以重複利用查詢快取結果了。
將查詢分解後,執行單個查詢可以減少鎖的競爭。
在應用層做關聯,可以更容易對資料庫進行拆分,更容易做到高效能和可擴充套件。
查詢本身效率也可能會有所提公升
可以減少冗餘記錄的查詢。
更進一步,這樣做相當於在應用中實現了雜湊關聯,而不是使用mysql的巢狀環關聯,某些場景雜湊關聯的效率更高很多。
參考:
MySQL單錶多次查詢和多表聯合查詢,哪個效率高?
很多高效能的應用都會對關聯查詢進行分解。簡單地,可以對每個表進行一次單錶查詢,然後將結果在應用程式中進行關聯。例如,下面這個查詢 select from tag join tag post on tag post.tag id tag.id join post on tag post.post id...
單錶多表查詢
一 基本概念 1 定義 資料庫是按照資料型別分類儲存資料的倉庫 2 資料褲在測試中的作用 加深了測試的深度。create database 庫名 建立資料庫 drop database 庫名 直接刪除資料庫,不再提醒 show databases 查詢資料庫 use database 庫名 進入資料...
MySQL聯表查詢
顯示所有員工名字 emp.ename 員工工資 emp.sal 及所在部門的名字 dept.dname 笛卡爾積 emp num dept num 聯表查詢時一定要帶上關聯條件 select ename,sal,dname from emp,dept where emp.deptno dept.de...