mysql子查询的方式_分布式系统中一种迭代处理MYSQL子查询的方法
1、技術背景
1.1 背景技術
在分布式mysql中間件系統,DML語句中,子查詢需要可能涉及到多個數據分片,如果在DML語句使用子查詢,需要首先解析出子查詢的具體內容,然后根據路由把子查詢發往到各個分片并收集查詢結果,才能在上一級查詢中進行下一步的查詢。
已有的實現中均沒有很好的不受限制的支持子查詢,即使有支持也僅限于子查詢所在的表與父查詢所在的表
路由和分片方式一致,而該實現對sql語句要求特別高,可操作性不強。
1.2現有技術
目前并沒有分布式mysql中間件系統中能完整的執行帶子查詢的sql處理。
2、技術方案
2.1? 所要解決的技術問題
在分布式mysql中間件系統中,完整的支持帶子查詢的sql請求
2.2? 技術方案
本方案主要有4個步驟,其中步驟1),2),3)是不斷迭代執行的。
1)首先解析出完整的sql語句中的子查詢以及子查詢與父查詢的交互方式
2)優先執行子查詢
3)匯總子查詢的查詢結果,根據子查詢與父查詢的交互方式,重新拼裝sql,然后去執行父查詢
4)不斷迭代執行,直到sql被執行完畢
舉例
SELECT [FirstName]
,[MiddleName]
,[LastName]
FROM [AdventureWorks].[Person].[Contact]
WHERE ContactID IN
(SELECT EmployeeID
FROM [AdventureWorks].[HumanResources].[Employee]
WHERE SickLeaveHours>68)
對于這種查詢語句,處理的過程如下
1)首先通過sql解析,解析出子查詢
SELECT EmployeeID
FROM [AdventureWorks].[HumanResources].[Employee]
WHERE SickLeaveHours>68
2)執行子查詢,子查詢的執行也會涉及到數據的路由,可能會發送到若干數據分片去執行。
SELECT EmployeeID
FROM [AdventureWorks].[HumanResources].[Employee]
WHERE SickLeaveHours>68
3)上一條子查詢結果返回后,與父查詢的WHERE關鍵詞進行再次拼裝和處理,例如,若該子查詢返回的是ID數據為(1,3,89),則該結果重新與父查詢進行sql拼裝組合為
SELECT [FirstName]
,[MiddleName]
,[LastName]
FROM [AdventureWorks].[Person].[Contact]
WHERE ContactID IN(1,23,89)
4)將該查詢發到相應的數據分片上去執行,再次取得的結果為最終結果。
2.3
流程圖
圖2-1
圖2-2
圖2-2中的“不帶子查詢的SQL處理”對應于圖2-1的流程。
2.3? 有益效果
通過本技術方案,可以讓分布式mysql中間件系統能夠保持分布式系統的優點的前提下,盡可能的處理復雜的帶子查詢的sql語句,并且能夠支持OLAP的應用。
2.4? 鍵點
1)在分布式mysql中間件系統中,通過sql子查詢與父查詢的解析關系,能夠將sql子查詢的結果與父查詢重新拼裝成新的迭代后的sql查詢,從而使整個系統能夠處理復雜的帶子查詢的sql處理。
2.5
名詞解釋
分布式mysql中間件系統: 類似于mysql官方提供的mysql proxy架構的系統,能夠屏蔽數據庫系統底層數據分布和處理,能夠并行執行sql處理并進行結果匯總。
sql解析:將sql語句中各種語法元素,比如關鍵詞select,from,where, in, any等內部各種信息解析的處理。
總結
以上是生活随笔為你收集整理的mysql子查询的方式_分布式系统中一种迭代处理MYSQL子查询的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 锁 会话_MySQL会话锁等
- 下一篇: systemd管理mysql多实例_使用