本文介紹了讀寫分離類的Hint語法。

本文適用于PolarDB-X 1.0 5.3及以上版本。

PolarDB-X 1.0提供了一種針對應用層透明的讀寫分離實現。但是由于RDS主實例與只讀實例之間數據的同步存在著毫秒級別的延遲,如果在主庫中變更以后需要馬上讀取變更的數據,則需要保證將讀取數據的SQL下發到主實例中。針對這種需求,PolarDB-X 1.0提供了讀寫分離自定義HINT,指定將SQL下發到主實例或者只讀實例。

語法

/*+TDDL:
    master()
    | slave()
*/          

在該自定義HINT中可以指定SQL是在主實例上執行還是在只讀實例上執行。對于/*+TDDL:slave()*/,如果一個主RDS實例存在多個只讀實例,那么PolarDB-X 1.0會根據所分配的權重隨機選擇一個只讀實例執行SQL語句。

注意事項

  • PolarDB-X 1.0自定義HINT支持/*+TDDL:hint_command*//!+TDDL:hint_command*/兩種格式。
  • 如果使用/*+TDDL:hint_command*/格式,在使用MySQL官方命令行客戶端執行帶有PolarDB-X 1.0自定義HINT的SQL時,請在登錄命令中加上-c 參數。否則,由于PolarDB-X 1.0自定義HINT是以MySQL 注釋形式使用的,該客戶端會將注釋語句刪除后再發送到服務端執行,導致PolarDB-X 1.0自定義HINT失效。具體請查看MySQL 官方客戶端命令。

示例

  • 指定SQL在主實例上執行:
    SELECT /*+TDDL:master()*/ * FROM table_name;               

    在SQL第一個關鍵字之后添加/*+TDDL:master()*/這個自定義HINT后,這條SQL將被下發到主實例上執行。

  • 指定SQL在只讀實例上執行:

    SELECT /*+TDDL:slave()*/ * FROM table_name;               

    在SQL第一個關鍵字之后添加/*+TDDL:slave()*/這個自定義HINT后,這條SQL將會根據所分配的權重被隨機下發到某個只讀實例上執行。

    說明
    • 此讀寫分離自定義HINT僅僅針對非事務中的讀SQL語句生效,如果SQL語句是寫SQL或者SQL語句在事務中,那么還是會下發到RDS的主實例執行。
    • PolarDB-X 1.0針對/*+TDDL:slave()*/自定義HINT,會從只讀實例中按照權重隨機選取一個下發SQL語句執行。若只讀實例不存在時,不會報錯,而是選取主實例執行。