欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL查詢重寫插件的使用

 更新時間:2020年11月11日 09:49:31   作者:AsiaYe  
這篇文章主要介紹了MySQL查詢重寫插件的使用,幫助大家更好的理解和維護數(shù)據(jù)庫,感興趣的朋友可以了解下

查詢重寫插件

從MySQL 5.7.6開始,MySQL Server支持查詢重寫插件,可以在服務器執(zhí)行之前檢查并可能修改服務器接收的語句。

以下是官方文檔介紹:

  預解析重寫插件具有以下特點:

1.該插件允許在服務器處理之前重寫到達服務器的SQL語句。

2.該插件接收一個語句字符串,并可能返回一個不同的字符串。

后解析查詢重寫插件具有以下特征:

  1.該插件支持基于解析樹的語句重寫。

  2.服務器解析每個語句并將其解析樹傳遞給插件,插件可以遍歷樹。插件可以將原始樹返回到服務器以進行進一步處理,或者構(gòu)造不同的樹并返回該樹。

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

安裝或卸載

最簡單的安裝過程如下:

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

可以發(fā)現(xiàn),在數(shù)據(jù)庫中多增加了一個庫query_rewrite,查看該數(shù)據(jù)庫:

查看插件當前是否安裝:

實踐操作

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

SELECT DBA_no, name from DBA_inf where DBA_no = ?

改寫成:

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

要為Rewriter插件添加規(guī)則,具體步驟分為兩步:

1.向rewrite_rules表中添加相應的規(guī)則;

2.調(diào)用flush_rewrite_rules()存儲過程以將表中的規(guī)則加載到插件中。

以下示例創(chuàng)建一個簡單規(guī)則來匹配選擇單個文字值的語句,執(zhí)行的操作:

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");

查詢剛剛插入的規(guī)則:

輸出的規(guī)則每一列的內(nèi)容如下:

id:

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

pattern:

指示規(guī)則匹配的語句模式的模板,使用?表示匹配的數(shù)據(jù)值。

pattern_database:

該數(shù)據(jù)庫用于匹配語句中的非限定表名。如果相應的數(shù)據(jù)庫和表名相同,則語句中的限定表名與模式中的限定名匹配;當默認數(shù)據(jù)庫pattern_database與表名相同且語句名相同時,語句中的非限定表名才匹配模式中的非限定名稱 。

replacement:

指示如何重寫與pattern列值匹配的語句的模板。使用 ?表示匹配的數(shù)據(jù)值,?是參數(shù)標記,實際語句中可以替換。

enabled:

規(guī)則是否已啟用。加載操作(通過調(diào)用flush_rewrite_rules() 存儲過程執(zhí)行)Rewriter僅在此列加載時才將表中的規(guī)則加載到 內(nèi)存緩存中YES。此列可以在不刪除規(guī)則的情況下停用規(guī)則:將列設(shè)置為除YES表之外的值 ,然后將表重新加載到插件中。

message:

該插件使用此列與用戶進行通信。如果將規(guī)則表加載到內(nèi)存中時沒有發(fā)生錯誤,則插件會將message 列設(shè)置為NULL。非NULL值表示錯誤,列內(nèi)容是錯誤消息。在這些情況下可能會發(fā)生錯誤:1.模式或替換是一個產(chǎn)生語法錯誤的錯誤SQL語句。2.替換包含比模式更多的參數(shù)標記。如果發(fā)生加載錯誤,插件還會將 Rewriter_reload_error狀態(tài)變量設(shè)置為ON。

pattern_digest:

此列用于調(diào)試和診斷。如果在將規(guī)則表加載到內(nèi)存中時該列存在,則插件會使用模式摘要更新它。此列可幫助確定某些語句無法重寫的原因。

normalized_pattern

此列用于調(diào)試和診斷。如果在將規(guī)則表加載到內(nèi)存中時該列存在,則插件會使用模式的規(guī)范化形式對其進行更新。如果您嘗試確定某些語句無法重寫的原因,則此列可能很有用。

重寫器查詢重寫插件過程

將規(guī)則添加到 rewrite_rules表中不足以使Rewriter插件使用該規(guī)則。還必須調(diào)用flush_rewrite_rules()以將表內(nèi)容加載到插件內(nèi)存緩存中:

Rewriter插件操作使用存儲過程將規(guī)則表加載到其內(nèi)存緩存中,在正常操作下,用戶僅調(diào)用flush_rewrite_rules()從而將rewrite_rules表的內(nèi)容加載到Rewriter內(nèi)存高速緩存中。加載表后,它還會清除查詢緩存。

當修改規(guī)則表后,需要重新調(diào)用此過程以使插件從新表內(nèi)容更新其緩存:

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

SELECT DBA_no, name from DBA_inf where DBA_no =8;

通過使用explain語句查看,當前SQL已經(jīng)使用了索引

重寫插件操作信息

該Rewriter插件通過幾個狀態(tài)變量提供有關(guān)其操作的信息:

有關(guān)這些變量的說明:

  • Rewriter_number_loaded_rules:成功從rewrite_rules表中加載到內(nèi)存中以供Rewriter 插件使用的重寫插件重寫規(guī)則的數(shù)量。
  • Rewriter_number_reloads:rewrite_rules被加載到Rewriter插件緩存中的次數(shù)。
  • Rewriter_number_rewritten_queries:Rewriter查詢重寫插件自加載以來重寫的查詢數(shù) 。
  • Rewriter_reload_error:是否在最近將rewrite_rules表加載到Rewriter 插件使用的內(nèi)存高速緩存中時發(fā)生錯誤 。如果值為OFF,則不會發(fā)生錯誤。如果值為,則ON發(fā)生錯誤;檢查表的message列rewriter_rules是否有錯誤消息。

通過調(diào)用flush_rewrite_rules()存儲過程加載規(guī)則表時 ,如果某些規(guī)則發(fā)生錯誤,則該CALL 語句會產(chǎn)生錯誤,并且該插件會將 Rewriter_reload_error狀態(tài)變量設(shè)置為ON:

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

重寫器插件使用字符集

當rewrite_rules表加載到Rewriter插件中時,插件使用character_set_client系統(tǒng)變量的當前全局值來解釋語句 。如果character_set_client隨后更改全局 值,則必須重新加載規(guī)則表。

客戶端的會話character_set_client值必須 與加載規(guī)則表時的全局值相同,否則規(guī)則匹配將不適用于該客戶端。

以上就是MySQL查詢重寫插件的使用的詳細內(nèi)容,更多關(guān)于MySQL查詢重寫插件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL對于各種鎖的概念理解

    MySQL對于各種鎖的概念理解

    今天小編就為大家分享一篇關(guān)于MySQL對于各種鎖的概念理解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • MySQL版oracle下scott用戶建表語句實例

    MySQL版oracle下scott用戶建表語句實例

    這篇文章主要給大家介紹了關(guān)于MySQL版oracle下scott用戶建表語句的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • mysql8.0配置文件my.ini詳解

    mysql8.0配置文件my.ini詳解

    這篇文章主要介紹了mysql8.0配置文件my.ini,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • mysql刪除表數(shù)據(jù)如何恢復

    mysql刪除表數(shù)據(jù)如何恢復

    這篇文章主要介紹了mysql刪除表數(shù)據(jù)如何恢復,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • MySQL數(shù)據(jù)庫分區(qū)功能的使用教程

    MySQL數(shù)據(jù)庫分區(qū)功能的使用教程

    這篇文章主要介紹了MySQL數(shù)據(jù)庫分區(qū)功能的使用教程,文中特別講解了MySQL分表和分區(qū)的區(qū)別以及聯(lián)系,需要的朋友可以參考下
    2016-05-05
  • Mysql中Join的使用實例詳解

    Mysql中Join的使用實例詳解

    本章節(jié)我們將向大家介紹如何使用MySQL 的 JOIN 在兩個或多個表中查詢數(shù)據(jù)。對mysql中的join感興趣的朋友一起學習吧
    2017-04-04
  • SQL面試題:求時間差之和(有重復不計)

    SQL面試題:求時間差之和(有重復不計)

    這篇文章主要介紹了SQL面試題:求時間差之和(有重復不計),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • MySQL的Flush-List和臟頁的落盤機制

    MySQL的Flush-List和臟頁的落盤機制

    這篇文章主要介紹了MySQL的Flush-List和臟頁的落盤機制,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • Mysql之如何根據(jù).frm和.idb文件恢復表結(jié)構(gòu)

    Mysql之如何根據(jù).frm和.idb文件恢復表結(jié)構(gòu)

    這篇文章主要介紹了Mysql之如何根據(jù).frm和.idb文件恢復表結(jié)構(gòu)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • MySQL數(shù)據(jù)庫備份與恢復方法

    MySQL數(shù)據(jù)庫備份與恢復方法

    網(wǎng)站數(shù)據(jù)對我們對站長來說都是最寶貴的,我們平時應該養(yǎng)成良好的備份數(shù)據(jù)的習慣。
    2010-12-12

最新評論