本文介紹了讀寫分離類的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語句執行。若唯讀執行個體不存在時,不會報錯,而是選取主執行個體執行。