2010-05-27 26 views
8

Bazı ölçütlere göre 100 milyondan fazla satır içeren bir tablodan yaklaşık 10 K satırı silmek zorundayım. Sorguyu çalıştırdığımda yaklaşık 5 dakika sürer. Açıkladığım bir plan çalıştırdım (MySQL explain delete'u desteklemediğinden select *'a dönüştürülen delete sorgusu) ve MySQL'in yanlış dizini kullandığını fark ettim.MySQL, silme ve ipucu ipucu

Soruma soru: MySQL'in hangi dizini silme sırasında kullanacağını söylemenin bir yolu var mı? Değilse ne yaparım? Geçici tabloyu seçin ve geçici tablodan silinsin mi?

+0

Birincil anahtarınızın olduğundan ve silinizin WHERE yan tümcesinde belirtilen sütunun dizine eklendiğinden emin olun. –

cevap

4

index hint syntax var. //ETA: sadly, not for deletes

ETA: ANALYZE TABLE $mytable'u çalıştırmayı denediniz mi?

Eğer bu ödeme yapılmazsa, 2 seçeneğiniz olduğunu düşünüyorum: Silme işleminden önce kusurlu indeksi bırakın ve sonra yeniden oluşturun. Veya istediğiniz indeksin kullanıldığından emin olmak için silme tablonuzu istediğiniz indekste başka bir tabloya katın.

+1

Evet, ancak benim anlayış endeksi ipucu için silme ifadeleri işe yaramaz. –

+0

@Manuel Darveau: Drat! Sadece test ettim. Haklısın. – dnagirl

2

MySQL'in yanlış dizini seçtiği bir durumla karşılaşmadım, ancak dizinlerin nasıl işlediğine dair anlayışım genelde hatalıydı.

Bu kitabı kontrol etmek isteyebilirsiniz: http://oreilly.com/catalog/9780596003067

Bu bir dizin nasıl büyük bölümü ve diğer ayarlama seçenekleri vardır.

+0

+1, kitap hiç düşünmeyeceksin pek çok şey üzerine gözlerini açar. – newtover

+0

Düzenleme, dnagirl dizin ipucu sözdizimi hakkında haklıdır, bunun canlı olduğunu bilmiyordum. – UltimateBrent

+0

Mysql'i yanlış indeksi birçok kez seçtiğimi gördüm. Bizim için çok sayıda benzer indeksleri (15 indeks) olan büyük bir masa (15M satır) üzerinde olur. Belki de çılgın bir senaryo --- bir nedeni var --- ve seçimin ne zaman PRIMARY olması gerektiğinde bile yanlış indeksi sık sık alır. –