Mysql

從 MySQL 中的 PARTITIONed 表中進行 SELECT 的最佳性能方式是什麼:顯式分區選擇,使用 WHERE 子句進行修剪,或兩者兼而有之?

  • September 25, 2021

假設你有:

CREATE TABLE  demo (
   amount ,
   year ,
   cycle ,
   otherStuff ,
   PRIMARY KEY ( id , year , cycle )
) ENGINE = INNODB
PARTITION BY RANGE ( year )
SUBPARTITION BY KEY ( cycle ) 
SUBPARTITIONS 12 (
   PARTITION p2020 VALUES LESS THAN (2021) ,
   PARTITION p2021 VALUES LESS THAN (2022) ,
   PARTITION p2022 VALUES LESS THAN (2023) ,
   PARTITION pmax VALUES LESS THAN MAXVALUE
);

在該表上執行的最佳 SELECT 是什麼?

A:

SELECT otherStuff FROM demo WHERE amount > 10 AND year = 2022 AND cycle = 1;

乙:

SELECT otherStuff FROM demo (p2022, p1) WHERE amount > 10;

或者

C:

SELECT otherStuff FROM demo (p2022, p1) WHERE amount > 10 AND year = 2022 AND cycle = 1;

我確信在修剪過程中有一些額外的成本——儲存引擎需要採取一些初步步驟來確定哪些分區與 WHERE 子句匹配。但是,如果只有一個分區和子分區與 WHERE 子句匹配,而修剪 WHERE 子句僅包含簡單的等於比較,我想弄清楚的是額外成本是否對性能來說是名義上的。我想弄清楚這一點的原因是因為我想知道我是否可以擺脫修剪,這在設計上提供了一個優勢:如果我願意,我可以擺脫我的分區並且不需要更改任何查詢。換句話說,顯式分區選擇引入了我寧願避免的依賴關係。

謝謝。

重新“綁定”:

與其他數據庫不同,MySQL 在客戶端進行綁定。因此,無論是否綁定,伺服器都有相同的工作量,並通過相同的決策來優化查詢。

作為一種對抗“SQL 注入”和正確轉義字元串的方法,在客戶端中綁定是可取的。

EXPLAIN對於單個查詢,我已經看到多達 6 個不同的查詢計劃(通過)。差異是由不同的值觸發的,用於綁定。

所有三種方法都應該產生相同的查詢計劃,因此從這個角度來看應該沒有區別。當查詢變得有點複雜時,您顯然需要在您的環境中驗證這一點,以確保分區修剪在您期望的時候實際發生。

在子句中僅使用條件where更容易在應用程序中以安全、可重用的方式實現,因為您只是使用綁定變數,而不是在謂詞更改時嘗試動態建構分區子句。這使得查詢計劃更有可能已經被記憶體並且可以在執行查詢時重用,這會對性能產生影響。

引用自:https://dba.stackexchange.com/questions/300143