MySQL InnoDB 與 PostgreSQL 的 Partial Index(es) 是不一樣的東西…
MySQL InnoDB 指的 Partial Index 是:
An index that represents only part of a column value, typically the first N characters (the prefix) of a long VARCHAR value.
而 PostgreSQL 指的 Partial Indexes 是:
A partial index is an index built over a subset of a table; the subset is defined by a conditional expression (called the predicate of the partial index). The index contains entries only for those table rows that satisfy the predicate. Partial indexes are a specialized feature, but there are several situations in which they are useful.
先講結論,PostgreSQL 可以做掉 MySQL InnoDB 的 Partial Index 想做的事情,而且還更多。
MySQL InnoDB 的 Partial Index 是設定對 prefix index (對字串前面的 n bytes),可能的情況是 CHAR(32)
只對前面 16 bytes 索引。
PostgreSQL 的 Partial Indexes 受益於許多方面而更強大。因為有 Indexes on Expressions,所以除了可以像 MySQL 對 prefix 索引外,也可以索引 suffix,甚至是索引透過 string function 得出來的值。
像是 PostgreSQL 可以設定「我只要索引一月一日出生的人的 username」:
CREATE INDEX test_index ON test_table (username) WHERE birth_month = 1 AND birth_day = 1;
在 MySQL 裡需要反正規化後下 index,或是拆出另外一個表格再下 index 的問題,在善用 PostgreSQL 這些功能就可以省下不少功夫…