我想要做的示意代码:
INPUT VAR inputOne; (First input of the desired statement)
INPUT VAR inputTwo; (Second input of the desired statement)
INPUT VAR inputThree; (Third input of the desired statement)
-
VAR repResult = getResult("SELECT * FROM `representatives` WHERE `rID` = inputOne LIMIT 1;")
VAR evResult = getResult("SELECT `events`.`eID` FROM `events` WHERE `eventDateTime` = inputTwo LIMIT 1;")
if (repResult != null && evResult != null) {
execureQuery("INSERT INTO `votes` (`representatives_rID`, `events_eID`, `voteResult`) VALUES(inputOne,evResult.eID,inputThree);");
}
当我在单独的语句中执行它们时,它非常慢,特别是因为需要检查和插入~1.000.000。 我想知道,如果有任何替代方案,可以采用一种查询方式。
答案 0 :(得分:3)
您可以使用INSERT-SELECT语法来完成此任务:
INSERT INTO `votes` (`representatives_rID`, `events_eID`, `voteResult`)
select inputOne, `events`.`eID`, inputThree FROM `events` WHERE `eventDateTime` = inputTwo LIMIT 1
上面将所有三个参数组合成一个INSERT-SELECT语句,其中select的结果被发送到插入。
请参阅:Insert into ... values ( SELECT ... FROM ... )了解select-insert语句。
答案 1 :(得分:1)
是的,您可以将这些语句放入1个存储过程(返回2个结果集并执行1次插入),但不是,这可能没有帮助。因为3个SQL语句不是大量的网络流量,并且因为存储过程在MySQL中很慢。
rID是主键吗?第一个查询是否提取了您不需要的大字段?
eventDateTime上有唯一索引吗?如果表不是InnoDB,则索引应明确包含eID,因此它将成为覆盖索引。
制作这些密钥后,您可以删除LIMIT 1
。
rID和eID数据类型是否尽可能小?