2010-08-18 73 views
0

我有mysql數據庫,其中一個表有700萬條記錄,表需要優化,我有點猶豫是要添加索引,因爲這將需要很多時間來添加700萬條記錄。我一直在慢查詢日誌中獲取此表查詢,沿着查詢以樂觀的方式編寫。表數據增加 - 查詢很慢

什麼是最好的方法來處理這個問題,以便表查詢不會出現緩慢的查詢?

+0

同意......什麼類型的查詢,顯然是到永遠(很慢)這是你最大的問題......很多人在這裏可能是能夠以您可能沒有考慮過的其他優化技術的方式提供幫助 – DRapp 2010-08-18 23:47:13

+0

中刪除where column1 in(select1 from ); 假設table1有700萬條帶有主鍵的記錄。 表2有50K記錄的合適索引。 – Sharpeye500 2010-08-19 00:30:24

回答

0

從table1中刪除where column1 in(從table2中選擇column1);不是最優的。

嘗試

delete table1 t1 
from table1 t1 
inner join table2 t2 on t2.column1 = t1.column1 
where conditions=true; 

我相信應該有更好的表現

+0

謝謝,爲什麼我們在相同的查詢中使用兩次表t1? – Sharpeye500 2010-08-19 17:59:00

+0

從這裏檢查多表語法:http://dev.mysql.com/doc/refman/5.0/en/delete.html – ceteras 2010-08-19 22:36:33

0

沒有你的代碼,沒有確切的幫助。索引是要走的路,需要一點時間,但只有一次。它確實增加了插入的開銷,但這是增加查詢效率的代價。

0

您需要創建一個索引。不完全是。也許甚至不止一個。

對7百萬行的查詢沒有索引將會變慢。你可以拆分表格或爲緩存分配大量的內存,但是索引會讓你獲得更大的壓力。

您可能會問,您應該創建哪個索引?好問題。這取決於您對該表運行的特定查詢。表格設計由您的數據決定,但優化由您的查詢決定。

學會使用EXPLAIN。請參閱Explain Demystified

瞭解索引如何工作。見More Mastering the Art of Indexing


回覆您的評論:是的,主鍵隱含有一個索引(至少在MySQL的),但我不知道如果查詢你需要提高從該指數的好處。

這裏有一個提示:當我想在一個非常大的表上嘗試索引時,我從一個子集的行中創建一個副本表。

mysql> create table test.mytable as select * from realdb.mytable limit 10000; 
mysql> use test; 

把一些不重要的行放入表中,但是處理它的數量不會太長。

現在您可以創建和刪除索引並測試查詢以瞭解它們的執行方式。一旦確定了能夠給您帶來最大收益的索引或索引,您可以更放心地在真實數據庫上創建它們是值得的。

+0

我確實有主鍵,我猶豫添加另一個索引的原因是它將鎖定表並且值得這樣做,或者我們可以採取任何其他方式來實現,不會影響/產生等待時間。 – Sharpeye500 2010-08-19 00:31:41