像这样的mytable:
CREATE TABLE `test1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`project_id` int(11) NOT NULL,
`md5` varchar(255) NOT NULL,
`create_time` datetime NOT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`,`project_id`,`md5`),
KEY `index_id` (`md5`),
) ;
我想通过md5
和project_id
进行分区。所以我创建了一个函数:
CREATE FUNCTION f2(md5 VARCHAR(255), project_id int(11))
RETURNS int
return MOD(md5, 10) + project_id;
当我分区这个表时使用这个sql:
ALTER TABLE test1 PARTITION BY HASH(f2(md5, project_id)) PARTITIONS 100;
表明:
不允许在(子)分区函数中使用常量,随机或时区相关的表达式。
但答案不是常数,随机和时区依赖。所以我不知道如何处理id,谁可以帮助我?非常感谢你。
如果你浏览hash partitioning上的MySQL文档,你会发现某些结构是prohibited for partitioning:
禁止的结构。分区表达式中不允许使用以下结构:
存储过程,存储函数,UDF或插件。 声明变量或用户变量。
要解决此问题,请尝试仅内联UDF函数背后的逻辑:
ALTER TABLE test1 PARTITION BY HASH(MOD(md5, 10) + project_id) PARTITIONS 100;
即使一个函数可以工作,它可能不是那么高效,直接表达是一个更好的方法。