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-blah
和 a-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
我在
是否可以根据 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-blah
和 a-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