2010-07-06 59 views
0

在mysql中有很多緩慢的查詢,只涉及更新和刪除語句。這些表格有2個索引列,並且沒有大量索引表。每張桌子平均有30K記錄。緩慢查詢更新/刪除sql語句

請就如何克服與更新和刪除查詢有關的緩慢查詢給出建議。這些類型的查詢:

DELETE FROM <table2> 
WHERE ID IN (SELECT ID 
       FROM <table1> WHERE ID2=100); 

...或:

UPDATE <table1> 
    SET <colmunname>=0 
WHERE id=1001; 
+0

他們是大型索引表? – David 2010-07-06 20:04:29

+1

您的問題太寬泛,無法專門回答。它可以是查詢到連接的任何內容。您是否可以發佈查詢,以便我們可以更深入地瞭解它們? – 2010-07-06 20:04:36

+0

這些表有2個索引列,而且沒有大量索引表。每張桌子平均有30K記錄。 – Sharpeye500 2010-07-06 20:05:46

回答

2

之處在於表索引,我的第一個建議是使用ANALYZE TABLE來更新表中的統計:

ANALYZE TABLE table1, table2 

但要注意:

在分析過程中,表被鎖定了讀鎖對MyISAM,BDB,和InnoDB。

+0

分析將對緩慢查詢有什麼好處? – Sharpeye500 2010-07-06 20:15:22

+0

@Karthick:'ANALYZE TABLE'將更新指定表的統計信息(包括索引),然後優化器將使用這些信息來決定如何訪問和最終使用數據。 – 2010-07-06 20:16:29

+0

感謝小馬。 當我跑Analze表,我看到的是這樣的 表-1>表名稱OP->分析Msg_type->狀態Msg_text->確定 所以這將有助於減少慢查詢的開銷? – Sharpeye500 2010-07-06 20:20:27

1

,你的問題只存在於更新和刪除的事實告訴我,你很可能索引太多。

索引將極大地減少某些查詢所花費的時間,但在插入,更新和刪除表中的條目時需要額外的工作。嘗試刪除經常更新的列上的索引,特別是如果它們不經常出現在SQL查詢中的where子句中。

+1

索引不僅用於WHERE子句 - SELECT,JOIN和ORDER BY可以在優化器認爲適合時利用索引使用。 – 2010-07-06 20:12:30

-1

首先和最重要的:使用stored procedures

下一步:如果你的數據庫具有優化功能 - >使用它們。

最後:考慮使用沒有關係DBS像CouchDBCassandra代替;-)

+1

存儲過程不會讓SQL更快... – 2010-07-06 20:15:22

+0

對不起,我允許使用MySQL,我會在未來的DB選擇中加入您的觀點。 – Sharpeye500 2010-07-06 20:15:58

0

在更新和刪除操作期間,管理索引和外鍵關係都會產生開銷。我會在開發服務器上恢復您的prod數據庫的副本,放棄所有外鍵約束,並期望您的主鍵索引和性能差異。然後你可以添加你的索引,直到你有更好的性能平衡的應用程序。

+1

外鍵不影響查詢的速度;它們僅限制指定列的數據。 – 2010-07-06 20:14:37