MySQL 根据varchar字段的首字母进行分区

MySQL partitioning based on the first letter of varchar field

我在 中为 Postgres 提出了一个非常相似的问题,但是,我想在 mysql 5.7 中执行此操作。

是否可以根据 varchar 字段的第一个字符在 MySQL 中划分 table?

我有一个垂直 table,格式为:

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `field_name` varchar(255) NOT NULL,
  `field_value` text NOT NULL,
  PRIMARY KEY (`id`)
)

这个table的大小超过1亿条记录。

我们使用的大多数 select 查询,指定要搜索的 field_name。我想做的是根据field_name划分table。

因此,当我们有一个像 field_name='email'field_value='xyz@mail.com' 这样的查询时,查询只会在包含所有电子邮件的分区中搜索并跳过其余分区。

field_name 不是一个完整的列表,因此,我将无法使用列表分区。键分区也可能很难使用,因为我不想在分区中包含 id,并且键分区需要包含主键。

例如:

对于以下 3 条记录:

a-blah
a-blah2
b-blah

a-blaha-blah2 将进入 A 分区,b-blah 将进入 B分区.

(2) 如果 MySQL 无法满足上述条件,那么什么是均匀划分大型生长垂直 table 的好方法?

field_name='email' and field_value='xyz@mail.com'

所以,您的真正问题是 EAV 架构设计。它有很多低效率和分区,尤其是你建议的方式对性能没有帮助。

WordPress 是 EAV 的一个常见示例,但可以通过改进索引来提供一些帮助:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

更笼统地说:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

有助于 EAV 的技术:http://mysql.rjweb.org/doc.php/eav

只有 4 种情况下分区有助于提高性能;听起来不适合你的情况:http://mysql.rjweb.org/doc.php/partitionmaint