[英]MySQL Poor performance INSERT or PHP PDO
通常,当用户访问我的网站时,他会平均一次平均“订阅”约50个事件,我们将其保存在一个可将许多用户链接到许多事件的mapping_table
中。 maping_table
大约有5万个条目,每天增长数百个。
INSERT
映射表中的〜50行大约需要10到20秒,这使我的网站显得很慢。
我似乎无法解决如何改善以下PHP或SQL以减少INSERT时间的问题,因为这似乎很基本。
这是SHOW CREATE
语句:
CREATE TABLE `mapping_table` (
`user_id` char(21) NOT NULL,
`event_id` char(21) NOT NULL,
`update_id` char(10) NOT NULL,
PRIMARY KEY (`user_id`,`event_id`),
KEY `event` (`event_id`),
CONSTRAINT `mapping_table_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users_table` (`user_id`) ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT `mapping_table_ibfk_2` FOREIGN KEY (`event_id`) REFERENCES `events_table` (`event_id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1
我的PHP脚本的插入部分:
$update_id = 'RandomString';
$conn = new PDO($pdo_serv, $db_user, $db_pwd);
$stmt = $conn->prepare("INSERT INTO `mapping_table` (`user_id`, `event_id`, `update_id`)
VALUES (:uid,:eid,:upd)");
//GO THROUGH EACH USER SUBSCRIBED EVENTS AND INSERT THEM
foreach($subscribed_events AS $event) {
$stmt->bindParam(':uid', $userid);
$stmt->bindParam(':eid', $event->id);
$stmt->bindParam(':upd', $update_id);
$stmt->execute();
}
我愿意接受任何建议。
附加信息 :
如果我microtime
每个插入我的300ms的平均得到每个刀片1秒。
我尝试删除UNIQUE KEY
,然后删除所有FOREIGN KEYS
,然后删除所有INDEXES
但是这些在性能上没有任何区别。
在对我的问题发表评论之后,我对php进行了如下修改,以进行batch INSERT
:
$update_id = 'RandomString';
$conn = new PDO($pdo_serv, $db_user, $db_pwd);
$sql = "INSERT INTO `mapping_table` (`user_id`, `event_id`, `update_id`)
VALUES ";
$values = "";
//GO THROUGH EACH USER SUBSCRIBED EVENTS GENERATE VALUES STRING
foreach($subscribed_events AS $event) {
$values .= "('".$userid."','".$event->id."','".$update_id."'),"
}
//Proceed batch insert
$values = rtrim($values, ",");
$sql .= $values;
$stmt = $conn->prepare($sql);
$stmt->execute();
这将我的平均插入时间减少到每行插入少于10毫秒(之前的每行300毫秒减少到1秒)。 没想到差异会那么大。 谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.