mysql存储过程小结

On 12/11/2011, in mysql, by kilobug

由于我希望sphinx能把单表的数据分成多个索引以提升多核性能
需要计算出某表的N分之X的最小最大ID,稍微学习了mysql存储过程
以下为实现SQL:

DELIMITER //
CREATE PROCEDURE `sph_distribute`(IN `tabname` VARCHAR(50), IN `idname` VARCHAR(50), IN `num` INT, IN `pos` INT)
BEGIN
	SET @SQL = CONCAT('SELECT CEIL(COUNT(*)/', num, ')+0 INTO @step FROM `', tabname, '`');
	PREPARE stmt1 FROM @SQL;
	EXECUTE stmt1;
	DEALLOCATE PREPARE stmt1;
 
	SET @SQL = CONCAT('SELECT `', idname, '` INTO @minid FROM `', tabname, '` ORDER BY `', idname, '` ASC LIMIT ', FLOOR((pos - 1) * @step), ',1');
	PREPARE stmt1 FROM @SQL;
	EXECUTE stmt1;
	DEALLOCATE PREPARE stmt1;
 
	IF pos = num THEN
		SET @SQL = CONCAT('SELECT MAX(`', idname, '`) INTO @maxid FROM `', tabname, '`');
		PREPARE stmt1 FROM @SQL;
		EXECUTE stmt1;
		DEALLOCATE PREPARE stmt1;
	ELSE
		SET @SQL = CONCAT('SELECT `', idname, '` INTO @maxid FROM `', tabname, '` ORDER BY `', idname, '` ASC LIMIT ', FLOOR(pos * @step - 1), ',1');
		PREPARE stmt1 FROM @SQL;
		EXECUTE stmt1;
		DEALLOCATE PREPARE stmt1;
	END IF;
 
	SELECT @minid, @maxid, @step;
END;//
DELIMITER ;

调用:

CALL sph_distribute('表名', 'id字段名', 分成多少份, 第几份);

例子:

CALL sph_distribute('table', 'id', 5, 3);

一些MYSQL不常见的写法:
1、DELIMITER,用于定义SQL结束符号;
2、SELECT …… \G,将每个字段一行显示;
3、PROCEDURE中,变量当表名只能用PREPAGE处理,里面的赋值变量,只支持全局变量(即 @var)
4、对整数的变量整乘,会自动转换为浮点,这点我很蛋疼,可以用FLOOR再转成整数

 

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

无觅相关文章插件,快速提升流量