2015-11-06 61 views
2

如果我向mysql服務器發出:select * from tuser where name='Bob'。 MySQL服務器會做些什麼,檢索一條記錄,然後立即將它發送給客戶端,或者在獲取大量數據後將其發送到一起,然後繼續執行其他結果?MySQL服務器如何檢索數據並將數據發送給客戶端?

+0

這不是嚴格的這個網站的主題。 請閱讀[我可以問哪些主題](http://stackoverflow.com/help/on-topic) – RiggsFolly

回答

2

執行過程結果返回客戶端程序。隨着行在執行樹上「冒泡」,頂級操作員通常負責將這些行寫入網絡緩衝區並將其發送回客戶端。結果不是先創建到某些中間存儲器(內存或磁盤)中,然後發送回客戶端,而是在創建時發送(隨着查詢的執行)。當然,將結果發送回客戶端需要遵循網絡流量控制協議。如果客戶端沒有主動地使用結果(例如通過調用SqlDataReader.Read()),那麼最終流量控制將不得不阻止發送端(正在執行的查詢),這又會暫停執行查詢。只要網絡流量控制釋放所需的網絡資源,查詢就會恢復併產生更多結果(繼續執行迭代計劃)。


因此,查詢的結果發送到客戶端「作爲查詢執行」。

Here您可以閱讀關於SQL服務器如何執行查詢的更多信息。

+0

你知道你在這裏選擇了sql server而不是mysql嗎?這兩個數據庫引擎是否在檢索數據並將數據發送回客戶端時運行相同?如果有請請網站來源?否則這個答案如何正確? – BK435

+0

SQL(結構化查詢語言)不是數據庫引擎。這是訪問和操作數據庫的標準語言。 MySQL是這個標準的具體實現。你可以在這裏閱讀更多:http://stackoverflow.com/questions/14840808/what-is-the-difference-between-sql-and-mysql –

+0

我的以前的評論仍然是站得住腳。 SQL SERVER與Microsoft SQL服務器一樣,是一種與MySQL不同的數據庫引擎...您正在談論SQL,因爲它涉及到MySQL和T-SQL在上述評論中的語法差異......我正在談論數據庫引擎本身的作品...有些區別可以在這裏看到http://www.noelherrick.com/blog/mysql-vs-sql-server – BK435

2

在網絡協議層次上,一旦服務器找到/構建記錄,行就會一次發送到客戶端 - 除查詢緩存(用於後續相同的查詢)外,沒有服務器端緩存,網絡I/O緩衝區(由net_buffer_length配置參數控制,默認爲16K)。在客戶端,您可能會看到一些緩衝,具體取決於您使用的客戶端和設置。本地C libmysqlclient有兩個調用 - mysql_use_result()和mysql_store_result()。第一個是緩衝區,第二個是緩衝區。大多數高級語言都有客戶端API,它們圍繞libmysqlclient進行打包,並且可以使用緩衝區或無緩衝區的方法。

相關問題