[英]DELETE-Queries are taking too much time
我在Galera-cluster(3個服務器)中有一個MariaDB-tabel subject_message_new
,它注冊用戶已閱讀消息。 我們有31000
用戶和數百萬條消息,因此表非常大(現在多達150萬條記錄)。 如果消息已更新, $id_message
必須刪除所有帶有$id_message
的讀取$id_message
。
用戶還可以將消息復制到另一個主題,因此消息( $id_message
)指向原始消息( id_message_org
),並且必須刪除該原始消息中的已the-read-entry
。
這是我的MySQL表:
Kolom Type Commentaar
id bigint(20) Auto nummering
id_message int(11)
id_subject int(11) NULL
nr_user int(11)
datetime datetime
Indexen
PRIMARY id
INDEX nr_user
INDEX id_message
INDEX id_subject
Foreign keys
id_message subject_message(id_message) CASCADE CASCADE
nr_user users(nr_user) CASCADE CASCADE
id_subject subject(id_subject) CASCADE CASCADE
我有一個PHP函數,消息更改后會調用
function message_new($id_message,$id_subject){
global $conn;
mysqli_query($conn,"DELETE FROM subject_message_new WHERE (id_message='$id_message' AND id_subject='$id_subject') OR id_message IN(SELECT id_message FROM subject_message WHERE id_message_org='$id_message')");
}
如果我將子查詢拆分為2 x DELETE
DELETE-查詢,則需要2 x 6-12
秒...
此功能(查詢)在生產中最多花費6-12秒的時間。 有人可以給我建議如何調整嗎? 還是讓它更好地工作?
問題在於您的delete方法中的子查詢。將單個語句拆分為兩個查詢將明顯提高性能。
從subject_message_new那里刪除id_message ='$ id_message'和id_subject ='$ id_subject';
從smn.id_message = sm.id_message_org上的subject_message_new smn內聯接subject_message sm刪除;
注意:在執行“ 選擇”,“更新”或“刪除”操作時,我們應該嘗試使用JOIN而不是子查詢
然后,在subject_message_new表的id_message和id_subject列中添加索引。 並在subject_message中為id_message_org列添加索引。 這絕對可以解決問題。
也許使用多表UPDATE/DELETE
語法重寫查詢會有所幫助,這將是這樣的:
DELETE subject_message_new.* FROM subject_message_new
LEFT JOIN subject_message
ON (subject_message_new.id_message = subject_message.id_message)
WHERE (subject_message_new.id_message='$id_message'
AND subject_message_new.id_subject='$id_subject')
OR id_message.id_message_org='$id_message';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.