2013-04-23 266 views
1

化背景如何决定MySQL 5.5中的varchar分区范围?

我有一个非常大的表,表就是这样

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'或'中国'(中文字符)。

我已经使用HASH(做)做分区,但我的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 
) 
; 

类似的问题

我读了以下两个Q &作为: Partitioning a database table in MySQL How to Partitioning a table using a LIKE criteria in Mysql 但它们对于英语 世界,不适合我的情况。

问题

  1. 使用标题做分区是更好的,对不对?
  2. 你能给我一个“utf-8”范围的例子吗? 我尝试'500000','1000000',...,但他们不工作。
  3. 如果我使用tb_doc WHERE标题='12345'中的SELECT xxx,请仅从第一部分获取数据?
  4. 这张表是〜50GB,有多少分区是最佳的?

在此先感谢您。

回答

1

我可以注意到VARCHAR在正确存储来自多种语言的字符时会出现问题,最好使用NVARCHAR

HASH分区用于均匀分配负载分区。我会说,首先你应该划分一些对人有意义的东西(经常出现在Where子句中的列),然后进行HASH子分区,以便同时使用尽可能多的内核。因此,在这种情况下,HASH子分区的数量将为< =无核心。

我建议你在title列上创建聚簇索引。这会加快你的查询速度。

而且相对于你的问题:

  1. 不neceserally。它会加快查询速度,因为聚簇索引,而不是分区。 使用分区来管理表:例如。快速删除多行。 如果查询好比例查找许多行(不只是1)或title不是UNIQUE列,那么你可以考虑分区

  2. 为UTF-8分区边界的一个例子,我会说:less then ('c')

  3. 根据您定义分区的方式,它可能会命中1个,多个或全部分区。

  4. 对于拥有多个分区没有惩罚,但是MySQL 5.5+中的表最多可以有1024个分区和子分区。

当你焕通过字符串值做分区,使用KEY PARTITIONING如下所述:18.2.5. KEY Partitioning

例子:

CREATE TABLE tm1 (
    s1 CHAR(32) PRIMARY KEY 
) 
PARTITION BY KEY(s1) 
PARTITIONS 10; 

,因为在你的字母(或您预计在表中看到所有字母)开始的分区相同的集数。

0

分区由title,即使你能做到这一点,将加快

SELECT did, title,... FROM tb_doc WHERE title= '1111111'; 

为了什么一些用例划分的局限性的进一步讨论,再加上它会帮助,看到my blog;