按列值对 MySQL 表进行分区

Posted

技术标签:

【中文标题】按列值对 MySQL 表进行分区【英文标题】:Partition MySQL table by Column Value 【发布时间】:2016-10-15 13:48:08 【问题描述】:

我有一个包含 2000 万行的 mysql 表。我想分区以提高速度。表格格式如下:

column    column   column   sector

data      data     data     Capital Goods
data      data     data     Transportation
data      data     data     Technology
data      data     data     Technology
data      data     data     Capital Goods
data      data     data     Finance
data      data     data     Finance

我使用以下代码应用了分区:

ALTER TABLE technical
PARTITION BY LIST COLUMNS (sector)
(
PARTITION P1 VALUES IN ('Capital Goods'),
PARTITION P2 VALUES IN ('Health Care'),
PARTITION P3 VALUES IN ('Transportation'),
PARTITION P4 VALUES IN ('Finance'),
PARTITION P5 VALUES IN ('Technology'),
PARTITION P6 VALUES IN ('Consumer Services'),
PARTITION P7 VALUES IN ('Energy'),
PARTITION P8 VALUES IN ('Healthcare'),
PARTITION P9 VALUES IN ('Consumer Non-Durables'),
PARTITION P10 VALUES IN ('Consumer Durables')
);

到目前为止一切都很好,但是当我通过 phpMyAdmin 查看表格时,它会显示:

sector怎么会小于capital goods

我做错了什么?

【问题讨论】:

我请瑞克看看,内德。您还需要为架构和访问路径(UX 及其功能)提供更多详细信息,以便任何人提供帮助。 sector的数据类型是什么?什么版本的 MySQL 服务器? SHOW CREATE 如何反映您的分区? @Uueerdo 'sector' 是一个字符串,MySQL 是 5.5 版。我不确定你问题的第三部分是什么意思 dev.mysql.com/doc/refman/5.5/en/show-create-table.html 应该返回一个反映表当前结构的创建语句;我不肯定它包含分区(它省略了触发器),但值得尝试看看它是否只是 phpMyAdmin 歪曲,或者 MySQL 对您的更改的解释与您的意图不同。 我认为语言脱节很明显,而 Uu 和我会谈论模式和较低级别的访问,您的经验是使用 phpmyadmin 和字符串。所以不同的世界或多或少。可能很难轻松弥合这种分歧。不确定其他人是否看到昨天的question ...因此也许不需要这个。我们并没有忘记它。 【参考方案1】:

问题只是 phpMyAdmin 以不寻常的方式重新发送数据。数据库现在按预期工作,查询如下:

SELECT * WHERE ... AND sector = "Energy" 

运行得更快。

感谢 Drew、Uueerdo、Rick James 和其他所有人帮助我理解这个问题。

【讨论】:

以上是关于按列值对 MySQL 表进行分区的主要内容,如果未能解决你的问题,请参考以下文章

如何按列值对二维数组进行排序?

在MySQL中按列值进行SUM

按列值分组的列值更新mysql排名

按列值的差异对 SQL 中的数据进行分组

如何按列值的计数进行分组并对其进行排序?

按列值的前导字符对数据行进行分组