存储过程内的多个查询不起作用?

时间:2014-09-04 12:53:47

标签: mysql sql stored-procedures pdo query-optimization

我正在研究每天涉及大量插入的项目(尽管我可能没有遵循构建DW的确切概念)。

这里我列出了要根据公共API获取的社交媒体活动(状态计数)进行监控的用户列表。 让列表包含大约500K用户,

用户表格如下:

CREATE TABLE IF NOT EXISTS `user_list` (
  `id` int(11) NOT NULL,
  `name` varchar(300) COLLATE utf8_unicode_ci NOT NULL,
  `location` varchar(300) COLLATE utf8_unicode_ci NOT NULL,
  `time_zone` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL,
  `crawl_status` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

在此表中,我将获取一组用户ID并将其传递给API以获取其总状态计数。

因此,如果我传递10个用户ID,我将得到一个包含10个用户ID的数组,其状态为count.I只会从API中获取总状态计数,这需要进一步与过去几天的总计数进行比较以获得用户的每日状态计数。

这是结果表结构,

CREATE TABLE IF NOT EXISTS `user_status_count` (
  `user_id` bigint(11) NOT NULL,
  `date` date NOT NULL,
  `total_status` int(11) NOT NULL,
  `status_count_day` int(11) NOT NULL,
  PRIMARY KEY (`date`,`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我将工作流设想为,

1)从表user_list获取一组具有爬网状态= 0的ID,将此ID传递给API并获取包含用户ID和总状态计数的结果数组。

2)然后我需要解析每个用户ID并比较它们的状态(当前和最后一天之间的差异)

3)需要将此详细信息插入结果表user_status_count

4)完成对每个ID的处理后,我需要更新user_list表中的爬网状态。

由于它涉及大量操作--500k * 3(SELECT最后一天的计数+ INSERT到结果表+ UPDATE用户列表表),我尝试在MySQL中使用存储过程。

程序如下,

CREATE PROCEDURE GetCount(IN userid INT(11),IN cur_date DATE,IN cur_count INT(11))
BEGIN
DECLARE total_cnt INT;
DECLARE daily_cnt INT;
SELECT total_status 
INTO total_cnt 
FROM `tc_user_status_count` 
WHERE `user_id` = userid AND LAST_DAY(cur_date);
SET daily_cnt = cur_count - total_cnt;
INSERT INTO `tc_user_status_count` 
(`user_id`, `date`, `total_status`, `status_count_day`) 
VALUES 
(userid, cur_date, cur_count, daily_cnt);
UPDATE `tc_user_list` SET `crawl_status`= 1  WHERE `id`= userid;
END

存储过程调用

SET @p0 =  '4';

SET @p1 =  '2014-09-05';

SET @p2 =  '5000';

CALL `GetCount` (
@p0 , @p1 , @p2
);

此处p0是用户ID,p1是当前日期和p2当前状态计数。

在传递这些参数时,我希望执行以下一组查询,

1.每天获取状态计数,比较前一天的总数,

(SELECT total_status INTO total_cnt 来自tc_user_status_count WHERE user_id = userid AND LAST_DAY(cur_date);)

2.将其保存到结果表中。

3.UPDATE用户列表表的爬网状态。

实际上这是我创建的第一个存储过程,它没有给出预期的结果。由于我们在此考虑了很多性能,因此我尝试实施SP。我使用PHP - MySQL和PDO进行数据库操作。

我没有通过创建的存储过程获得正确的结果?这是我的SP创建的问题吗?使用过程在多个查询实现中是否存在任何问题。

我是以正确的方式做事吗?任何建议都将受到高度赞赏。

0 个答案:

没有答案