MySQL 5.5 引入了“列分区”。
http://dev.mysql.com/doc/refman/5.5/en/partitioning-columns.html
我试图更好地理解当两列单独重要时它是如何工作的。
假设一个表包含两个系统用户之间的消息。我们可能有“sender_id”和“receiver_id”列,我们可能希望单独查询这些列。
如果我们在这两列上都有单独的索引,我们可以在必要时单独查询它们。结果很快。
但是如果我们的表有 100M 行大,并且我们考虑分区怎么办。我的理解是多列分区侧重于列定义中的第一列,然后是第二列。这是一个示例表结构:
CREATE TABLE messages (
message_id INT,
sender_id INT,
receiver_id INT
)
PARTITION BY RANGE COLUMNS(sender_id,receiver_id) (
PARTITION p0 VALUES LESS THAN (10,10),
PARTITION p1 VALUES LESS THAN (20,20),
PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)
如果我们查询“WHERE receiver_id=5”,分区修剪不会启动,对吧?它将需要搜索所有分区。但是如果我们要搜索“WHERE sender_id=5”,那么我们会立即知道结果在 p0 中。
因此,对于两个列可能各自重要的表,分区可能不是最好的解决方案,因为现在我们失去了在 columns 参数中为辅助列(receiver_id,在这种情况下)的全表索引的好处。那正确吗?
你是对的,mysql 将只检查一个分区是否有特定的 sender_id,但会检查所有分区是否有一个特定的 receiver_id,如下所示:
但是,根据您的硬件,该分区仍然有好处。在所有分区中查找receiver_id 时,mysql 实际上执行了3 个选择语句,每个分区一个。它可能能够并行化这些选择语句。此外,如果您索引receiver_id,它将访问3 个更小的索引。
最后,您只需要进行性能测试,看看它是否为您的用例带来了回报。现在看到 100MB 很容易放入 RAM,除非您有特定的理由,否则我不会考虑对这么小的表进行分区。