【问题标题】:MySQL partitioning based on the first letter of varchar fieldMySQL 根据 varchar 字段的首字母进行分区
【发布时间】:2019-12-28 09:58:57
【问题描述】:

我在Partitioning table based on first letter of a varchar field 中针对 Postgres 提出了一个非常相似的问题,但是,我想在 mysql 5.7 中执行此操作。

是否可以在 MySQL 中根据 varchar 字段的第一个字符对表进行分区?

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

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`)
)

这个表的大小超过100M条记录。

我们使用的大多数选择查询,指定field_name 进行搜索。我想要做的是根据field_name 划分表格。

所以当我们有一个像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 中是不可能的,那么有什么好的方法可以均匀地对一个不断增长的大型垂直表进行分区?

【问题讨论】:

  • 您希望这张表有多大,您是否尝试过一些更简单的方法,例如在field_name 上放置一个索引?
  • 是的,field_name 上已经有索引了,预计明年数据会翻一番。
  • 分区通常不会加快您的查询速度。虽然有一些查询可能会受益(例如,无法使用索引的分区键上的范围扫描,但执行全表扫描 - 然后all 可能只是分区;这通常与日期相关),在大多数情况下在这种情况下,它是一个维护工具(例如快速截断旧数据,或处理 large 表,其中您会遇到文件大小问题)。具体来说,使用field_value='xyz@mail.com' 查找数据会变慢(一点点),因为检查该条目所在分区的开销。
  • 这是不可能的也不会加快查询速度。相反,要有一个合适的索引。
  • 经验法则:最常见的字母出现的概率为 10%。也就是说,一个分区将容纳 10% 的表。

标签: mysql partitioning partition database-partitioning


【解决方案1】:

field_name='email' 和 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2021-03-26
    • 2015-01-31
    相关资源
    最近更新 更多