2010-07-29 3 views
6

El ile MySQL'de tablolar oluşturduğumda, her alan için sorguları için kullanacağımı düşündüğüm dizinleri birer birer eklerim.MySQL İndeksleri: Birden çok indekse sahip olmanın bir çoklu alan anahtarına sahip olması mı?

Bana göre tablo oluşturmak için phpMyAdmin'i kullandığımda ve tablolarım formunda dizinlerimi seçtiğimde, phpMyAdmin'in dizinlerimi 1'e (artı birincil telefonuma) dahil ettiğini görüyorum.

Fark nedir? Biri diğerinden daha mı iyi? Bu durumda?

Teşekkürler!

cevap

8

Bu aslında sizin sorgunuza bağlıdır. Bazı sorgular, çok-kanallı dizinlerin daha iyi kullanılmasını sağlar, bazıları değil. EXPLAIN arkadaşın.

http://dev.mysql.com/doc/refman/5.6/en/explain.html

Ayrıca çok iyi bir kaynaktır buradadır:

http://dev.mysql.com/doc/refman/5.6/en/optimization-indexes.html

+0

Henüz hiçbir soruyu henüz yazmamıştım (sadece tasarım aşamasında). Yani temelde söylüyorsun, benim sorgularımın hazır olduğu zamana kadar indekslerim yok ... –

+1

Bazı indeksler tasarım aşamasında düşünmek oldukça kolay, ama çoğu sizin sorgularınızı oluşturduğunuzda eklenecektir. – Mchl

12

Ne özellikle iyi bir strateji, ama seçim olsaydı birden çok tek dizinleri almak istiyorum.

Bunun nedeni, bir dizinin yalnızca tüm alanları dizinin tam bir önekinde kullanmanız durumunda kullanılabileceğidir. Bir dizin (a, b, c, d, e, f) varsa, bu, a üzerinde filtrelenen bir sorgu için ya da hem a hem de b filtresine filtre uygulayan bir sorgu için iyi çalışır, ancak yalnızca bir sorgu filtrelemesi için işe yaramaz c.

Her zaman en iyi dizinleri seçmek için çalışan kolay bir kural yoktur. Yaptığınız sorguların türlerine bakmanız ve bu belirli sorguları hızlandıran dizinleri seçmeniz gerekiyor. Sütunların sırasını dikkatlice düşünürseniz, çok sayıda farklı sorgular için yararlı olacak az sayıda dizin bulabilirsiniz. Örneğin, bir sorguda hem a hem de b filtrelerini ve yalnızca b'a filtre uyguladığınız başka bir sorguyu filtrelerseniz, (b, a) açıklığı her iki sorgu tarafından kullanılabilir, ancak bir (a, b) indeksi kullanılmayacaktır.