2011-03-07 14 views
6

güncelleştirilmiş soru:
ilgilenilen veri sadece alan = 1 olanlar ve gerçek wheere alanı veri oranı 1 vs 0 olanların çok küçük olduğunu (örneğin,% 1) Bu durumda , alanın indeksini alan dizinimi seçeceğim alan = 1 sorgu?endeksi MYSQL'de bir bit alanı

orijinal soru: Evet

 
select * from xxx where field=1; 

cevap

4

Genel olarak, hayır. Dizine eklendiğinde, iki satırlı bir alan sorguları hızlandırmaz, çünkü ortalama satırların yarısına bakmanız gerekir. Dizin girdilerinizin seçici olmasını istersiniz - endekste belirli bir giriş olası değerlerin sadece küçük bir yüzdesini temsil etmelidir (örneğin% 10'dan daha az, tercihen yüzde kesirlerine). Daha sonra indeksi kullanmak, tablodaki verilerin çoğunu yok sayar, bu da size bir performans avantajı sağlar.

Bazı DBMS, bitmap dizinlerini destekler. Yardım edebilirler, ancak hala seçicilik problemine giriyorsunuz.


güncellenen soru değeri 1 ile değerlerin sayısı (yüzde birden az) küçük olacağını söylüyor; Bir endeks size şimdi bir fayda sağlayacak mı?

cevabı şudur: değeri daha sonra 1, evet, sütun üzerinde bir indeks bir fayda sağlayabilir olduğunu belirtmek bu sorgular için

  • , iyileştirici aslında indeksi kullanan şartıyla . Dizinin, değerin 1 olduğu sorgular kullanılarak kullanılmasının lehine eğildiğini fark etmesini sağlamak için DBMS'yi düzeltmeniz gerekebilir; Bu, DBMS'ye özgü olma eğilimindedir, ancak istatistiklerin çeşitli kılavuzlarda güncelleştirilmesi, muhtemelen SQL sorgularında ipuçları kullanılarak oyunun adıdır. Tabii ki, optimizatör endeksi asla kullanmazsa, o zaman hala fayda sağlamaz - ve optimizer diğer indekslerin bir şekilde daha fazla yardımcı olmasına karar verebilir.

  • Değerin 0 olduğu sorgularda dizin kullanılmamalıdır. Ancak, olasılıklar, DBMS'nin 0 değerlerini de korumaya devam edecektir - asla kullanmamasına rağmen. Komut verilebilecek alışılmadık bir DBMS olurdu, bu sadece çok faydalı olsa da 'sıfırdan başka değerler için bu sütunu endeksle'.

Yani - bu bağlıdır. Sorgulara bağlı ve optimizatöre bağlı.

Ayrıca, bazı diğer geleneksel olarak kullanılan sütunlarda ve sonra bit alanında, bir bileşik dizinin bazı yararlar sağlayabileceğini de unutmayın. Yani, hemen her zaman bir tarih aralığından seçerseniz, tarih ve bit alanı sütunlarında (muhtemelen bu sırada) bir bileşik dizin size iyi bir dizin sağlamalıdır.

0

:
Ben indeksleme bu alan hız yukarı gibi sorguları seçecek, 0 veya 1 ya değere sahip olacak int alanı var. Ancak, böyle küçük bir alan için güncellemeler için ortaya çıkan performans isabetini almak istemeyebilirsiniz; Satırlarınız 50/50 0 veya 1 ise, tam bir tablo taraması yine de makul olabilir.

0

Değerlerin benzersiz olmaması, tüm değerleri taraması gerektiğinden ve ikili aramadan performans iyileştirmesi elde etmediğiniz doğrudur. Bununla birlikte, dikkate alınması gereken başka bir şey de vardır. Veri tabanı büyükse ve belleğe sığmıyorsa, verileri bakmadan önce belleğe yüklemelidir.Verileri içeren bir indeks varsa, bu indeksi tüm tablodan yüklemek çok daha hızlı olabilir. Muhtemelen tablonun kaç sütun olduğuna bağlı.