2012-03-02 9 views
10

MYSQL veritabanındaki bir tabloya, birkaç milyon satırlık büyüklükte olacak bir bileşik dizin eklemek istiyorum. Kompozit iki varchar sütunundan ve üç int sütundan oluşacaktır. Sorum şu başlıkta belirtildiği gibidir: Bu bileşik endeksi oluşturmak için en uygun düzen var mı? Örneğin, int satırlarından biri muhtemelen 6 olası değere sahip olacaktır, bu sütunun indeks tanımının önüne daha yakın olması daha iyi olur mu? Benzer şekilde, varchar sütunlarından birinin, indeks tanımının önüne veya arkasına yakın olması durumunda milyonlarca farklı değere sahip olması muhtemeldir?MYSQL bileşik dizini sipariş etmek için en uygun yöntem var mı?

+0

WHERE deyiminde, aralıkların aksine sabitlerle mi seçiyorsunuz? –

+0

Marcus, Muhtemelen bu tablodaki sorguların çoğunluğu için sabitlerle seçeceğim. – chicagoCrazy

cevap

16

Genel kural olarak, çok sütunlu bir dizinde, en yüksek kardinaliteye sahip sütunları veya başka bir deyişle, en yüksek sayıda farklı değer dizini, dizinde önce gelir.

Daha doğru olması için, arama ölçütlerinize mümkün olan en az eşleşme olan sütunu istediğiniz gibi ayarlamayı mümkün kılarsınız, böylece sonuç kümesini olabildiğince daraltabilirsiniz, ancak genel olarak en yüksek düzeylilikle aynıdır.

Örneğinizde, örneğinizde, yalnızca 6 farklı değere sahip olan dizinden önce milyonlarca farklı değere sahip olacak sütunu isteyeceksiniz.

Milyonlarca değerden yalnızca bir satır seçtiğinizi varsayarsanız, daha fazla satırı daha hızlı elemenize izin verir.

Benzer kardinalitenin iki sütununu düşünürken, daha küçük olanı (VARCHAR sütunlarından önce INTEGER sütunları) koyun; çünkü MySQL bunları daha hızlı karşılaştırabilir ve yineleyebilir.

Bir uyarı, aralıklarla seçiyorsanız (örn. WHERE datecol > NOW()), o zaman aralık sütunlarının en sağa doğru olmasını ve sütunlarınızın tek bir sabit (örn. WHERE id = 1) ile sola olmasını istersiniz. Bunun nedeni, endeksinizin yalnızca ilk aralık değerinin aradığı noktaya kadar arama ve sipariş için kullanılabileceğidir.

+4

Kardinalite her zaman doğru ölçüt değildir: Çok sütunlu dizin içeren bir tabloya sahibim. Burada, ilk sütunun yalnızca iki olası değeri vardır, sonraki sütunlar daha yüksek bir asaliteye sahiptir. Bu, endeks her zaman 2 değerin yalnızca 1'ini kullanan belirli bir arama için tasarlandığından ve bu değerin, sonucu% 95 oranında azalttığı için çalışır. Sorulması gereken en doğru soru, hangi sütunun sonucu en çok indireceği ve hangi noktaya uygunluk önemli bir kuraldır. –

+1

@Kai, yorumunuz beni şaşırtıyor. Belki belirli bir örnek verebilirsin. –

+0

@MarcusAdams Kai'nin ne söylediğini anlıyorum, bence burada oldukça iyi açıklanmış: http://www.percona.com/blog/2009/06/05/a-rule-of-thumb-for-choosing-column -de-in-indexler/ –

İlgili konular