背景
我有一张很大的桌子,桌子是这样的
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;
title 的类型是 varchar(80),大多数时候 title 会是纯数字字符串,比如 '111111','2222222','44444444',有时会是 utf-8 字符串,比如 '3a','a4 ' 或“中国”(汉字)。
我已经使用 HASH (did) 进行分区,但我的 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
)
;
类似问题
我阅读了以下两个问答: 在 MySQL 中对数据库表 进行分区 如何在 Mysql 中使用 LIKE 标准对表进行分区, 但它们适用于英语世界,不适用于我的情况。
问题
- 用title来做partition比较好,对吧?
- 你能给我一个“utf-8”范围的例子吗?我尝试了'500000','1000000',...,但它们不起作用。
- 如果我使用 SELECT xxx from tb_doc WHERE title='12345',MySQL 只从第 1 部分获取数据?
- 这张表是~50GB,多少个分区是最佳的?
先感谢您。