1. 程式人生 > 資料庫 >MySQL查詢重寫外掛的使用

MySQL查詢重寫外掛的使用

查詢重寫外掛

從MySQL 5.7.6開始,MySQL Server支援查詢重寫外掛,可以在伺服器執行之前檢查並可能修改伺服器接收的語句。

以下是官方文件介紹:

預解析重寫外掛具有以下特點:

1.該外掛允許在伺服器處理之前重寫到達伺服器的SQL語句。

2.該外掛接收一個語句字串,並可能返回一個不同的字串。

後解析查詢重寫外掛具有以下特徵:

1.該外掛支援基於解析樹的語句重寫。

2.伺服器解析每個語句並將其解析樹傳遞給外掛,外掛可以遍歷樹。外掛可以將原始樹返回到伺服器以進行進一步處理,或者構造不同的樹並返回該樹。

通俗來講,是指該外掛支援兩種重寫方式,一種是在語法解析之前,直接修改SQL字串,一種是在語法解析之後,通過操控語法解析樹來進行重寫。這個特性還是非常有用的,例如錯誤的上線了某個SQL,但由於無法走到索引導致全庫查詢; 或者你可能使用某個第三方的已編譯好的軟體,但SQL可能執行錯誤,你又無法直接修改應用,這個特性將會非常有用,還可以去編寫符合使用者要求的外掛。

安裝或解除安裝

最簡單的安裝過程如下:

shell> mysql -u root -p < install_rewriter.sql Enter password: (enter root password here)

MySQL查詢重寫外掛的使用

可以發現,在資料庫中多增加了一個庫query_rewrite,檢視該資料庫:

MySQL查詢重寫外掛的使用

檢視外掛當前是否安裝:

MySQL查詢重寫外掛的使用

實踐操作

例如為如下語句強制使用主鍵查詢:

SELECT DBA_no,name from DBA_inf where DBA_no = ?

改寫成:

SELECT DBA_no,name from DBA_inf force index(primary) where DBA_no = ?

要為Rewriter外掛新增規則,具體步驟分為兩步:

1.向rewrite_rules表中新增相應的規則;

2.呼叫flush_rewrite_rules()儲存過程以將表中的規則載入到外掛中。

以下示例建立一個簡單規則來匹配選擇單個文字值的語句,執行的操作:

insert into query_rewrite.rewrite_rules(pattern,replacement,pattern_database) values ("SELECT DBA_no,name from DBA_inf where DBA_no = ?","SELECT DBA_no,name from DBA_inf force index(primary) where DBA_no = ?","DBAs");

查詢剛剛插入的規則:

MySQL查詢重寫外掛的使用

輸出的規則每一列的內容如下:

id:

規則ID。此列是表主鍵。可以使用該ID唯一標識任何規則。

pattern:

指示規則匹配的語句模式的模板,使用?表示匹配的資料值。

pattern_database:

該資料庫用於匹配語句中的非限定表名。如果相應的資料庫和表名相同,則語句中的限定表名與模式中的限定名匹配;當預設資料庫pattern_database與表名相同且語句名相同時,語句中的非限定表名才匹配模式中的非限定名稱 。

replacement:

指示如何重寫與pattern列值匹配的語句的模板。使用 ?表示匹配的資料值,?是引數標記,實際語句中可以替換。

enabled:

規則是否已啟用。載入操作(通過呼叫flush_rewrite_rules() 儲存過程執行)Rewriter僅在此列載入時才將表中的規則載入到 記憶體快取中YES。此列可以在不刪除規則的情況下停用規則:將列設定為除YES表之外的值 ,然後將表重新載入到外掛中。

message:

該外掛使用此列與使用者進行通訊。如果將規則表載入到記憶體中時沒有發生錯誤,則外掛會將message 列設定為NULL。非NULL值表示錯誤,列內容是錯誤訊息。在這些情況下可能會發生錯誤:1.模式或替換是一個產生語法錯誤的錯誤SQL語句。2.替換包含比模式更多的引數標記。如果發生載入錯誤,外掛還會將 Rewriter_reload_error狀態變數設定為ON。

pattern_digest:

此列用於除錯和診斷。如果在將規則表載入到記憶體中時該列存在,則外掛會使用模式摘要更新它。此列可幫助確定某些語句無法重寫的原因。

normalized_pattern

此列用於除錯和診斷。如果在將規則表載入到記憶體中時該列存在,則外掛會使用模式的規範化形式對其進行更新。如果您嘗試確定某些語句無法重寫的原因,則此列可能很有用。

重寫器查詢重寫外掛過程

將規則新增到 rewrite_rules表中不足以使Rewriter外掛使用該規則。還必須呼叫flush_rewrite_rules()以將表內容載入到外掛記憶體快取中:

Rewriter外掛操作使用儲存過程將規則表載入到其記憶體快取中,在正常操作下,使用者僅呼叫flush_rewrite_rules()從而將rewrite_rules表的內容載入到Rewriter記憶體快取記憶體中。載入表後,它還會清除查詢快取。

當修改規則表後,需要重新呼叫此過程以使外掛從新表內容更新其快取:

MySQL查詢重寫外掛的使用

使用重寫外掛中定義的語句模式查詢相應記錄:

SELECT DBA_no,name from DBA_inf where DBA_no =8;

MySQL查詢重寫外掛的使用

通過使用explain語句檢視,當前SQL已經使用了索引

MySQL查詢重寫外掛的使用

重寫外掛操作資訊

該Rewriter外掛通過幾個狀態變數提供有關其操作的資訊:

MySQL查詢重寫外掛的使用

有關這些變數的說明:

  • Rewriter_number_loaded_rules:成功從rewrite_rules表中載入到記憶體中以供Rewriter 外掛使用的重寫外掛重寫規則的數量。
  • Rewriter_number_reloads:rewrite_rules被載入到Rewriter外掛快取中的次數。
  • Rewriter_number_rewritten_queries:Rewriter查詢重寫外掛自載入以來重寫的查詢數 。
  • Rewriter_reload_error:是否在最近將rewrite_rules表載入到Rewriter 外掛使用的記憶體快取記憶體中時發生錯誤 。如果值為OFF,則不會發生錯誤。如果值為,則ON發生錯誤;檢查表的message列rewriter_rules是否有錯誤訊息。

通過呼叫flush_rewrite_rules()儲存過程載入規則表時 ,如果某些規則發生錯誤,則該CALL 語句會產生錯誤,並且該外掛會將 Rewriter_reload_error狀態變數設定為ON:

MySQL查詢重寫外掛的使用

在這種情況下,請檢查rewrite_rules表中是否包含非NULL message列值的行,以檢視存在的問題。

重寫器外掛使用字符集

當rewrite_rules表載入到Rewriter外掛中時,外掛使用character_set_client系統變數的當前全域性值來解釋語句 。如果character_set_client隨後更改全域性 值,則必須重新載入規則表。

客戶端的會話character_set_client值必須 與載入規則表時的全域性值相同,否則規則匹配將不適用於該客戶端。

以上就是MySQL查詢重寫外掛的使用的詳細內容,更多關於MySQL查詢重寫外掛的資料請關注我們其它相關文章!