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ı?
cevap
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.
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. –
@Kai, yorumunuz beni şaşırtıyor. Belki belirli bir örnek verebilirsin. –
@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/ –
- 1. MySQL SİPARİŞ
- 2. MySQL SİPARİŞ BY COUNT()?
- 3. Büyük Grails uygulamasını modüle etmek için en iyi yöntem nedir?
- 4. Android için uygun herhangi bir fizik motoru var mı?
- 5. Python'da "joker yöntem" var mı?
- 6. mysql dizini
- 7. MySQL SİPARİŞ BY IN()
- 8. Bir mysql veri sürümlendirme sistemi için en iyi yöntem
- 9. Bir BitmapSource imha etmek için uygun yolu
- 10. MongoDB'de olduğu gibi MySQL için bir TTL var mı?
- 11. MySql için bir Profiler karşılığı var mı?
- 12. PHP MySQL SİPARİŞ
- 13. json.net anahtar yöntem var mı?
- 14. Memcached için linq nesnesini serilize etmek için zaten var mı?
- 15. Açıklamalı bir yöntem elde etmek için daha verimli bir yol var mı?
- 16. İhtiyaçlarıma en uygun olanı: MongoDB, CouchDB veya MySQL.
- 17. MySql bileşik anahtarları ve boş değerler
- 18. Symfony2'nin: oturum bir oturum var olup olmadığını kontrol etmek için bir yöntem var mı var veya yok
- 19. CLOS nesnelerini klonlamak için genel bir yöntem var mı?
- 20. Jenkins'i izlemek için uygun bir Eclipse eklentisi var mı?
- 21. Scala için uygun bir tarih/saat API var mı?
- 22. Hazırda Bekletme istatistiklerini göstermek için uygun bir GUI var mı?
- 23. HTTP etiketi özelliklerinin listelenmesi gereken belirli bir sipariş var mı?
- 24. Uygun yön/MySQL
- 25. Z dizini oluşturma hatası var mı?
- 26. Rails'de kontrolör eylemlerini sipariş etmek için sözleşme nedir?
- 27. Dairenin çevresi için en uygun nokta
- 28. FireMonkey için 3. Taraf Bileşenleri Dizini var mı?
- 29. Bağımlılıkları silmek için en uygun yol
- 30. MySQL varsayılan sipariş bağlıdır NEREDE
WHERE deyiminde, aralıkların aksine sabitlerle mi seçiyorsunuz? –
Marcus, Muhtemelen bu tablodaki sorguların çoğunluğu için sabitlerle seçeceğim. – chicagoCrazy