页:
[1]
| ytcheng | 2008-3-20 05:53 AM |
|
村里的兄弟有人用过mysql的分区表吗
用户数据量大了,想用一下mysql的分区表.
拟采用hash分区表,对用户名hash.
ALTER TABLE part PARTITION BY hash (aa) PARTITIONS 4;
但是问题是,hash后边的括号中的表达式要求返回整型,但是我的字段aa是个varchar型,该怎么转换呢 |
|
| 那就 PARTITION BY hash (ascii(aa)) |
|
| 不过这样不好,不能保证平均分布 比如一般用户名 s开头的 比较多,最好是想一个 别的表达式 |
| ytcheng | 2008-3-20 07:23 AM |
|
ascii我试过来,还试了ord,但是报错,说
Error Code : 1554
This partition function is not allowed |
|
| PARTITION BY hash (crc32(aa)) |
| ytcheng | 2008-3-20 07:29 AM |
|
| 5555还是那个错误,songlv 帮帮俺 |
|
| 你 mysql 什么版本阿? 是不是不支持分区维护阿?新建立一个表的时候分区试试 |
| ytcheng | 2008-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 */; |
| ytcheng | 2008-3-20 07:42 AM |
|
PARTITION BY HASH(crc32(`aa`)) PARTITIONS 8
把这句中的`aa`换成id就没有问题 |
| ytcheng | 2008-3-20 08:10 AM |
|
| 是不是mysql对这玩意儿支持不够好呀,看样子只能增加一个字段aa_crc32,把`aa`字段的crc32值算出来,填到这个字段,然后根据aa_crc32这个值进行分表.查询的时候也根据aa_crc32查 |
| ytcheng | 2008-3-20 08:17 AM |
|
| up up up .. |
| looking_for1 | 2008-3-20 09:05 AM |
|
| mysql分区功能还不是很完善 |
| jonyare | 2008-3-20 09:14 AM |
|
| mysql 官方网站上有篇文章[url]http://dev.mysql.com/tech-resources/articles/testing-partitions-large-db.html[/url] |
| xieaotian | 2008-3-26 12:42 AM |
|
| 我还真研究过,奉劝你别用分区表,如果非要实现的话,还是自己动手分表吧。(大型网站都这么做) |
|
[quote]原帖由 [i]xieaotian[/i] 于 2008-3-26 08:42 AM 发表
我还真研究过,奉劝你别用分区表,如果非要实现的话,还是自己动手分表吧。(大型网站都这么做) [/quote]
为什么?
mysql支持分区真的很让人兴奋,特别是操作的透明、I/O性能的提升,这点恐怕是一般的手动分表难以媲美的吧 |
Powered by Discuz! Archiver 6.1.0
© 2001-2006 Comsenz Inc.
Processed in 0.006574 second(s), 2 queries |