本文為您介紹并行查詢的使用限制以及與串行執行結果可能不兼容的地方,幫助您正確使用并行查詢功能。
并行查詢的使用限制
PolarDB會持續迭代并行查詢的能力,目前以下情況在并行計劃中會有一定的局限性:
查詢非Innodb表,查詢無法并行。
使用全文索引的查詢,查詢無法并行。
包含存儲過程Procedures的表達式,該表達式必須在leader上執行。
Index Merge方式進行表掃描,則該表無法并行。
串行化隔離級別事務內的查詢語句無法并行。
隔離級別是Repeatable-read的情況下,事務內的INSERT ... SELECT/REPLACE ... SELECT查詢部分無法并行。
與串行執行結果可能不兼容的地方
錯誤提示次數可能會變化
串行執行中出現錯誤提示的查詢,在并行執行的情況下,總體錯誤提示數可能會與串行有所不同。
精度問題
并行查詢的執行過程中,可能會出現比串行執行多出中間結果的存儲,如果中間結果是浮點型,可能會導致浮點部分精度差別,導致最終結果有細微的差別。
網絡包或者中間結果長度超出max_allowed_packet允許的最大長度
并行查詢的執行過程中,相比串行執行可能會多出中間結果。如果中間結果的長度超出了max_allowed_packet定義的最大長度,可能出現錯誤提示,可以通過增加max_allowed_packet參數的值來解決。如何修改參數請參見設置集群參數和節點參數。
結果集順序差別
當并行執行未加ORDER BY關鍵字的
SELECT ... LIMIT n
語句時,返回的結果集可能與執行順序不一致。由于有多個Worker同時執行,每次執行時Worker的執行速度是不確定的,當Leader得到足夠的數據后,就會返回結果,因此返回的結果集可能與執行順序不一致。加了行鎖的數據記錄數增多
當并行執行
SELECT ... FROM ... FOR SHARE
語句時,InnoDB會將訪問到的每一行數據都加鎖,因此加了行鎖的記錄數可能會比非并行執行的情況下要多,這屬于正常現象。