化背景
我有一张非常大的桌子,桌子就像这样
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 但它们适用于英语世界,不适用于我的情况。
问题
提前谢谢。
答案 0 :(得分:1)
请注意,VARCHAR
在正确存储多种语言的字符时会出现问题,请更好地使用NVARCHAR
。
HASH分区用于均匀分配分区上的负载。我要说的是,首先应该通过对人类有意义的事物进行分区(经常出现在Where子句中的列),然后进行HASH子分区以同时使用尽可能多的内核。因此,在这种情况下,HASH子分区的数量将是< = No cores。
我建议您在title
列上创建聚簇索引。这将加快您的查询速度。
关于你的问题:
不是很有意思。它会加速查询,因为聚簇索引,而不是分区。
使用分区来管理表:例如。快速删除很多行。
如果您的查询的很大一部分查找了多行(不只是1)或title
不是UNIQUE
列,那么您可以考虑分区
我会说:less then ('c')
根据您定义分区的方式,它可能会分为1个,几个或所有分区。
拥有多个分区不会受到任何惩罚,但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;
设置分区数量与字母表中的字母(或您希望在表格中看到的所有字母表)相同。
答案 1 :(得分:0)
按title
进行分区,即使您可以进行分区,也 加速
SELECT did, title,... FROM tb_doc WHERE title= '1111111';
有关PARTITIONing限制的进一步讨论,以及它将有用的少数用例,请参阅my blog;