Mysql
如何在mysql中對錶進行分區?
我讀了很多文章,
PARTITION
在大多數情況下 ing 沒有幫助。我相信它應該加快我的情況下的查詢。我有一個結構為的表CREATE TABLE pages ( page_id int(11) unsigned NOT NULL AUTO_INCREMENT, category_id smallint(5) unsigned, title varchar(255), created datetime, updated datetime, FOREIGN KEY(category_id) REFERENCES categories(category_id) ON DELETE CASCADE, UNIQUE INDEX (category_id,title), INDEX(title), PRIMARY KEY(page_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci ROW_FORMAT=COMPRESSED
該表接近 10 億行和 200-1000
category_id
。幾乎所有的查詢都
category_id
在其中。我認為
PARTITION
ing 表PARTITION BY KEY(category_id) PARTITIONS 40; // between 20-50
值得嗎?
關於這個表我有個壞消息:MySQL 不支持使用外鍵對錶進行分區
根據MySQL 5.7 Docs on Partitioning Limitations
InnoDB 儲存引擎。 InnoDB 外鍵和 MySQL 分區不兼容。分區的 InnoDB 表不能有外鍵引用,也不能有外鍵引用的列。不能對具有外鍵或被外鍵引用的 InnoDB 表進行分區。
沒有足夠的資訊。針對錶的查詢是什麼 - 更詳細。
同時, …
“幾乎所有查詢都有 category_id”是什麼意思?這對你是否在做有很大的不同
WHERE category_id = constant
相對
WHERE category_id IN (...)
對於前一種情況,我會推動將其
category_id
作為第一列PRIMARY KEY
:PRIMARY KEY(category_id, title) -- helps with queries, and is UNIQUE INDEX(page_id) -- to keep auto_inc happy
另一方面,是表中的所有列嗎?如果僅此而已,我無法想像有多個不同的
SELECTs
,即將 cat+title 映射到 page_id ,反之亦然。如果僅此而已,那麼您所擁有的就是最佳的。我所擁有的同樣是最佳的,只是減少了一個UNIQUE
約束。如果你有
category_id IN (...)
然後(再次)我們需要看到的其餘部分WHERE
。