首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定MySQL 5.5中的varchar分区范围?

如何确定MySQL 5.5中的varchar分区范围?
EN

Stack Overflow用户
提问于 2013-04-23 16:03:00
回答 2查看 4.2K关注 0票数 1

背景

我有一张很大的桌子,这张桌子就是这样

代码语言:javascript
复制
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语句通常如下

代码语言:javascript
复制
SELECT did, title,... FROM tb_doc WHERE title= '1111111';
SELECT did, title,... FROM tb_doc WHERE title= '2222222';

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

实验

我使用了以下声明:

代码语言:javascript
复制
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中使用类似的条件对表进行分区,但它们是针对英语世界的,而不是在我的情况下工作。

问题

  1. 使用标题来做分区更好,对吗?
  2. 你能给我一个"utf-8“范围的例子吗?我试过“500000”,“1000000”,.,但它们不起作用。
  3. 如果我使用来自tb_doc的SELECT xxx,其中标题=‘12345’,那么MySQL是否只从部分1获取数据?
  4. 这个表是~50 is,有多少分区是最优的?

提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2013-05-29 11:42:12

请允许我注意到,VARCHAR在正确存储多种语言的字符时会遇到问题,最好使用NVARCHAR

散列分区用于将负载均匀地分配到分区上。我想说的是,首先您应该通过对人有意义的东西进行分区( Where子句中经常出现列),然后进行散列子分区,以便同时使用尽可能多的核心。因此,在这种情况下,散列子分区的数量将是无核心的<=。

我建议您在title列上创建一个聚集索引。这将加速您的查询。

关于你们的问题:

  1. 不是必要的。它将加快查询,因为聚集索引,而不是分区。使用分区来管理表:例如。快速删除多行。如果查询中有很大一部分查找许多行(而不仅仅是1),或者title不是UNIQUE列,那么您可以考虑分区
  2. 作为UTF-8分区边界的一个例子,我要说:less then ('c')
  3. 根据定义分区的方式,它可能会达到1、几个或所有分区。
  4. 拥有多个分区没有任何损失,但是MySQL 5.5+中的表可以有多达1024个分区和子分区。

当您使用字符串值进行分区时,请使用KEY PARTITIONING,如下所述:18.2.5.密钥分割

示例:

代码语言:javascript
复制
CREATE TABLE tm1 (
    s1 CHAR(32) PRIMARY KEY
)
PARTITION BY KEY(s1)
PARTITIONS 10;

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

票数 1
EN

Stack Overflow用户

发布于 2015-11-26 06:27:22

通过title进行分区,即使您可以这样做,也不会加快速度。

代码语言:javascript
复制
SELECT did, title,... FROM tb_doc WHERE title= '1111111';

有关PARTITIONing的局限性的进一步讨论,以及它将帮助的少数用例,请参见我的博客

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16174097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档