[英]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.