背景
我有一张很大的桌子,这张桌子就是这样
CREATE TABLE tb_doc (
did mediumint(8) unsigned NOT NULL auto_increment,
title varchar(80) NOT NULL default '',
...,
PRIMARY KEY (did),
KEY title (title)
)
TYPE=MyISAM;标题的类型是varchar(80),大多数时候标题将是纯数字字符串,如'111111','2222222','44444444',有时它将是utf-8字符串,如'3a','a4‘或"中国“(汉字)。
我已经使用散列(did)来进行分区,但我的SELECT语句通常如下
SELECT did, title,... FROM tb_doc WHERE title= '1111111';
SELECT did, title,... FROM tb_doc WHERE title= '2222222';所以我想用标题来做分区,希望这样会更快。现在问题来了。
实验
我使用了以下声明:
PARTITION BY RANGE COLUMNS (title)(
PARTITION p00 VALUES LESS THAN (1), # not pure number strings
PARTITION p01 VALUES LESS THAN (500000), # pure number strings from 1 to 500k
PARTITION p02 VALUES LESS THAN (1000000), # pure number strings from 500k to 1000k
PARTITION p03 VALUES LESS THAN (1500000), # pure number strings from 1000k to 1500k
.......... # ......
PARTITION pn VALUES LESS THAN (25000000), # the biggest number now
)
;相似问题
我读了以下两个问题:在MySQL中划分数据库表 如何在Mysql中使用类似的条件对表进行分区,但它们是针对英语世界的,而不是在我的情况下工作。
问题
提前谢谢你。
发布于 2013-05-29 11:42:12
请允许我注意到,VARCHAR在正确存储多种语言的字符时会遇到问题,最好使用NVARCHAR。
散列分区用于将负载均匀地分配到分区上。我想说的是,首先您应该通过对人有意义的东西进行分区( Where子句中经常出现列),然后进行散列子分区,以便同时使用尽可能多的核心。因此,在这种情况下,散列子分区的数量将是无核心的<=。
我建议您在title列上创建一个聚集索引。这将加速您的查询。
关于你们的问题:
title不是UNIQUE列,那么您可以考虑分区less then ('c')。当您使用字符串值进行分区时,请使用KEY PARTITIONING,如下所述:18.2.5.密钥分割。
示例:
CREATE TABLE tm1 (
s1 CHAR(32) PRIMARY KEY
)
PARTITION BY KEY(s1)
PARTITIONS 10;首先设置与字母表中的字母相同的分区数(或您希望在表中看到的所有字母)。
发布于 2015-11-26 06:27:22
通过title进行分区,即使您可以这样做,也不会加快速度。
SELECT did, title,... FROM tb_doc WHERE title= '1111111';有关PARTITIONing的局限性的进一步讨论,以及它将帮助的少数用例,请参见我的博客;
https://stackoverflow.com/questions/16174097
复制相似问题