簡體   English   中英

刪除查詢需要太多時間

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM