如何在MySQL 5.5中决定varchar分区RANGE?

时间:2013-04-23 16:03:00

标签: mysql string partitioning 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';

所以我想用title来做分区,希望这会更快。现在问题来了。

实验

我使用了以下声明:

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& As: Partitioning a database table in MySQL How to Partitioning a table using a LIKE criteria in Mysql 但它们适用于英语世界,不适用于我的情况。

问题

  1. 使用title来做分区更好,对吗?
  2. 你能给我一个" utf-8"范围的例子? 我试过了500000' 1000000',......但是它们不起作用。
  3. 如果我使用tb_doc WHERE title =' 12345'中的SELECT xxx,那么MySQL只从分区1获取数据?
  4. 此表约为50GB,最佳分区数是多少?
  5. 提前谢谢。

2 个答案:

答案 0 :(得分:1)

请注意,VARCHAR在正确存储多种语言的字符时会出现问题,请更好地使用NVARCHAR

HASH分区用于均匀分配分区上的负载。我要说的是,首先应该通过对人类有意义的事物进行分区(经常出现在Where子句中的列),然后进行HASH子分区以同时使用尽可能多的内核。因此,在这种情况下,HASH子分区的数量将是< = No cores。

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

关于你的问题:

  1. 不是很有意思。它会加速查询,因为聚簇索引,而不是分区。 使用分区来管理表:例如。快速删除很多行。 如果您的查询的很大一部分查找了多行(不只是1)或title不是UNIQUE列,那么您可以考虑分区

  2. 我会说:less then ('c')

  3. 根据您定义分区的方式,它可能会分为1个,几个或所有分区。

  4. 拥有多个分区不会受到任何惩罚,但MySQL 5.5+中的表可以有多达1024个分区和子分区。

  5. 如果您不想按字符串值进行分区,请按照此处所述使用KEY PARTITIONING18.2.5. KEY Partitioning

    示例:

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

    设置分区数量与字母表中的字母(或您希望在表格中看到的所有字母表)相同。

答案 1 :(得分:0)

title进行分区,即使您可以进行分区,也 加速

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

有关PARTITIONing限制的进一步讨论,以及它将有用的少数用例,请参阅my blog;