MySQL工作原理

2021-08-07 23:53:50 字數 1161 閱讀 8735

資料庫通常不會被直接使用,而是由其他程式語言通過sql語句呼叫mysql,由mysql處理並返回執行結果。那麼mysql接受到sql語句後,又是如何處理的呢?

首先程式的請求會通過mysql的connectors與其進行互動,請求到處後,會暫時存放在連線池(connection pool)中並由處理器(management serveices & utilities)管理。當該請求從等待佇列進入到處理佇列,管理器會將該請求丟給sql介面(sql inte***ce)。sql介面接收到請求後,它會將請求進行hash處理並與快取中的結果進行對比,如果完全匹配則通過快取直接返回處理結果;否則,需要完整的走一趟流程:

(1)由sql介面丟給後面的直譯器(parser),上面已經說到,直譯器會判斷sql語句正確與否,若正確則將其轉化為資料結構。

(2)直譯器處理完,便來到後面的優化器(optimizer),它會產生多種執行計畫,最終資料庫會選擇最優化的方案去執行,盡快返會結果。

(3)確定最優執行計畫後,sql語句此時便可以交由儲存引擎(engine)處理,儲存引擎將會到後端的儲存裝置中取得相應的資料,並原路返回給程式。

這裡有幾點需要注意:

(1)如何快取查詢資料?

儲存引擎處理完資料,並將其返回給程式的同時,它還會將乙份資料保留在快取中,以便更快速的處理下一次相同的請求。具體情況是,mysql會將查詢的語句、執行結果等進行hash,並保留在cache中,等待下次查詢。

(2)buffer與cache的區別?

從上面的圖可以看到,快取那裡實際上有buffer和cache兩個,那它們之間是否有什麼不同呢?簡單的說就是,buffer是寫快取,cache是讀快取。

(3)如何判斷快取中是否已快取需要的資料

這裡可能有乙個誤區,覺得處理sql語句的時候,為了判斷是否已快取查詢結果,會將整個流程走一遍,取得執行結果後再與需要的進行對比,看看是否命中,並以此說,既然不管快取中有沒有快取到查詢內容,都要整個流程走一遍,那麼快取的優勢又在**??

實際上,並非如此,在第一次查詢後,mysql便將查詢語句以及查詢結果進行hash處理並保留在快取中,sql查詢到達之後,對其進行同樣的hash處理後,將兩個hash值進行對照,如果一樣,則命中,從快取中返回查詢結果;否則,需要整個流程走一遍。

MySQL 索引工作原理

為什麼需要索引 why is it needed 當資料儲存在磁碟類儲存介質上時,它是作為資料塊存放。這些資料塊是被當作乙個整體來訪問的,這樣可以保證操作的原子性。硬碟資料塊儲存結構類似於鍊錶,都包含資料部分,以及乙個指向下乙個節點 或資料塊 的指標,不需要連續儲存。記錄集只能在某個關鍵字段上進行排...

MySQL語法執行工作原理

目錄 二 從mysql語法執行原理談效能測試 三 資料庫伺服器快取配置策略 四 各資料庫集群部署方式 客戶端請求由nginx等負載均衡伺服器轉交給tomcat,tomcat從mysql中撈取資料,如果請求的資料在mysql快取中,那麼mysql會將快取中撈取到的資料返回給客戶端,如果快取中沒有請求的...

MySQL中order by的工作原理

假設有查詢語句 select city,name,age from t where city 杭州 order by name limit 1000,且city上建立索引。mysql為order by排序開闢的記憶體稱為sort buffer,如果要排序的資料量小於這塊記憶體,則在記憶體中進行排序。...