Mysql

如何在mysql中對錶進行分區?

  • September 3, 2019

我讀了很多文章,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在其中。

我認為PARTITIONing 表

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

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