喜悦国际村 » PHP高级编程 » 村里的兄弟有人用过mysql的分区表吗

页: [1]
ytcheng2008-3-20 05:53 AM
村里的兄弟有人用过mysql的分区表吗

用户数据量大了,想用一下mysql的分区表.
拟采用hash分区表,对用户名hash.
ALTER TABLE part PARTITION BY hash (aa) PARTITIONS 4;
但是问题是,hash后边的括号中的表达式要求返回整型,但是我的字段aa是个varchar型,该怎么转换呢

songlv2008-3-20 07:20 AM
那就 PARTITION BY hash (ascii(aa))

songlv2008-3-20 07:23 AM
不过这样不好,不能保证平均分布 比如一般用户名  s开头的 比较多,最好是想一个 别的表达式

ytcheng2008-3-20 07:23 AM
ascii我试过来,还试了ord,但是报错,说
Error Code : 1554
This partition function is not allowed

songlv2008-3-20 07:26 AM
PARTITION BY hash (crc32(aa))

ytcheng2008-3-20 07:29 AM
5555还是那个错误,songlv 帮帮俺

songlv2008-3-20 07:36 AM
你 mysql 什么版本阿? 是不是不支持分区维护阿?新建立一个表的时候分区试试

ytcheng2008-3-20 07:41 AM
5.2.3-falcon-alpha-community-nt
新建也不行,下面是我测试新建的语句
CREATE TABLE `part1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `aa` varchar(50) DEFAULT NULL,
  `ab` varchar(50) DEFAULT NULL,
  `ac` varchar(50) DEFAULT NULL,
  `ad` varchar(50) DEFAULT NULL,
  `ae` varchar(50) DEFAULT NULL,
  `af` varchar(50) DEFAULT NULL,
  `ag` varchar(50) DEFAULT NULL,
  `ah` varchar(50) DEFAULT NULL,
  `ai` varchar(50) DEFAULT NULL,
  `aj` varchar(50) DEFAULT NULL,
  `ak` varchar(50) DEFAULT NULL,
  `al` varchar(50) DEFAULT NULL,
  `am` varchar(50) DEFAULT NULL,
  `an` varchar(50) DEFAULT NULL,
  `ao` varchar(50) DEFAULT NULL,
  `ap` varchar(50) DEFAULT NULL,
  `aq` varchar(50) DEFAULT NULL,
  `ar` varchar(50) DEFAULT NULL,
  `as` varchar(50) DEFAULT NULL,
  `at` varchar(50) DEFAULT NULL,
  `au` varchar(50) DEFAULT NULL,
  `av` varchar(50) DEFAULT NULL,
  `aw` varchar(50) DEFAULT NULL,
  `ax` varchar(50) DEFAULT NULL,
  `ay` varchar(50) DEFAULT NULL,
  `az` varchar(50) DEFAULT NULL,
  `ba` varchar(50) DEFAULT NULL,
  `bb` varchar(50) DEFAULT NULL,
  `bc` varchar(50) DEFAULT NULL,
  `bd` varchar(50) DEFAULT NULL,
  `be` varchar(50) DEFAULT NULL,
  `bf` varchar(50) DEFAULT NULL,
  `bg` varchar(50) DEFAULT NULL,
  `bh` varchar(50) DEFAULT NULL,
  `bi` varchar(50) DEFAULT NULL,
  `bj` varchar(50) DEFAULT NULL,
  `bk` varchar(50) DEFAULT NULL,
  `bl` varchar(50) DEFAULT NULL,
  `bm` varchar(50) DEFAULT NULL,
  `bn` varchar(50) DEFAULT NULL,
  `bo` varchar(50) DEFAULT NULL,
  `bp` varchar(50) DEFAULT NULL,
  `bq` varchar(50) DEFAULT NULL,
  `br` varchar(50) DEFAULT NULL,
  `bs` varchar(50) DEFAULT NULL,
  `bt` varchar(50) DEFAULT NULL,
  `bu` varchar(50) DEFAULT NULL,
  `bv` varchar(50) DEFAULT NULL,
  `bw` varchar(50) DEFAULT NULL,
  `bx` varchar(50) DEFAULT NULL,
  `by` varchar(50) DEFAULT NULL,
  `bz` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `aa` (`aa`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 /*!50100 PARTITION BY HASH(crc32(`aa`)) PARTITIONS 8  */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

ytcheng2008-3-20 07:42 AM
PARTITION BY HASH(crc32(`aa`)) PARTITIONS 8
把这句中的`aa`换成id就没有问题

ytcheng2008-3-20 08:10 AM
是不是mysql对这玩意儿支持不够好呀,看样子只能增加一个字段aa_crc32,把`aa`字段的crc32值算出来,填到这个字段,然后根据aa_crc32这个值进行分表.查询的时候也根据aa_crc32查

ytcheng2008-3-20 08:17 AM
up up up ..

looking_for12008-3-20 09:05 AM
mysql分区功能还不是很完善

jonyare2008-3-20 09:14 AM
mysql 官方网站上有篇文章[url]http://dev.mysql.com/tech-resources/articles/testing-partitions-large-db.html[/url]

xieaotian2008-3-26 12:42 AM
我还真研究过,奉劝你别用分区表,如果非要实现的话,还是自己动手分表吧。(大型网站都这么做)

php52008-3-26 01:10 AM
[quote]原帖由 [i]xieaotian[/i] 于 2008-3-26 08:42 AM 发表
我还真研究过,奉劝你别用分区表,如果非要实现的话,还是自己动手分表吧。(大型网站都这么做) [/quote]


为什么?
mysql支持分区真的很让人兴奋,特别是操作的透明、I/O性能的提升,这点恐怕是一般的手动分表难以媲美的吧


查看完整版本: 村里的兄弟有人用过mysql的分区表吗


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.006574 second(s), 2 queries