İşte http://www.sqlfiddle.com/#!2/94daa/1
motor Bunu yaparken değil maliyeti ile bir dizin kullanmanın maliyeti karşılaştırmak zorundadır alışması bazı anahtarlar ile bir güncelleme var. Kullanılan dizinleri almak için daha fazla satır eklemem gerektiğine dikkat edersiniz. endeksi ile
, motor hızlı olan eşleşen değerleri elde etmek endeksi kullanmak zorundadır. Sonra, tablodaki gerçek satırları aramak için kibritleri kullanmak zorundadır. Dizin satır sayısını daraltmazsa, yalnızca tablodaki tüm satırları aramak daha hızlı olabilir.
Eğer mysql SQL Server kümelenmiş dizinlerine benzer bir şey varsa emin değilim. Bu durumda, dizin ve tablo verileri aynı yapıdadır, bu nedenle dizin aramanın ikinci adımına sahip değilsiniz.
Ben bir birincil anahtar tanımlayarak öncelikle kullanıcıların masaya, iki farklı şekilde dizinleri tanıtıldı. Bu, dolaylı olarak user_id sütununda benzersiz bir dizin oluşturacaktır. Eşsiz bir indeks, aynı değerler kümesini iki kez ekleyemezseniz anlamına gelir. Tek bir sütun dizini için bu sadece iki kez aynı değere sahip olamayacağınız anlamına gelir. sayfa başına bir kullanıcı ile tablo için kullanıcıların bir kitap, hayal ise
ardından oluşturulan endeks kullanıcının sayfa numarası ile her size user_id sıralı bir liste verir. Liste genellikle belirli bir numaraya hızlı bir şekilde bakmak için bir tür ağaç formunda saklanır. Bir telefon rehberindeki bir isme bakma şeklini düşünün, sadece siz onu bulana kadar tüm sayfaları taratmayın, nerede olacağını tahmin edin ve daha sonra kapanana kadar sayfaların parçalarını ileri veya geri alın . Normalde O (dizin n) zamanındaki bir dizindeki değerleri arayabilir, burada n satır sayısıdır ve benzer sayıda dizin sayfası okumalısınız. DB motoru sorgusu select * from users Where user_id = 3
verilirse
Şimdi, iki seçenek vardır. Her bir veri sayfasını okuyabilir ve doğru değeri arar (ilk önce durdurmak için birincil bir anahtar olduğu gerçeğini kullanabilir). Alternatif, doğru veri sayfasını almak için indeksi okumak ve ardından veri sayfasına bakmaktır.
Somutluk ve basitlik için, tablonun 1024 girişi olduğunu varsayalım. Her girişin bir veri sayfası aldığını varsayalım. Dizin ağacındaki her girdinin bir dizin sayfası aldığını varsayalım. Endeksin dengeli olduğunu varsayın, bu yüzden 10 seviyeye ve toplam 2047 sayfaya sahip.(tüm bu varsayımlar şüphelidir, ancak noktaları birbiriyle karıştırırlar, özellikle tüm sütunları aynı anda endeksleme eğiliminde olmadıkça özellikle dizin sayfaları neredeyse her zaman veri sayfalarından daha küçüktür).
Tablo taraması yapmak için yaklaşım 1024 veri sayfasını okumalıdır. İndeksi kullanmak için 10 dizin sayfasını ve bir veri sayfasını okuması gerekir. Hemen hemen tüm veritabanı performansı, okunan sayfaların sayısını en aza indirmektir.
Çoklu sütun dizinleri, hızlı bir şekilde veri kümelerine bakmayı sağlar. Eğer (col1, col2) ile bir endeksiniz varsa, sadece col1 ile eşleşir.
create index
ifadesi, yalnızca hangi sütunların dizine eklendiğini ve yinelenen değerlerin izin verilip verilmeyeceğini belirtir.
Kitap benzetimini tekrar kullanarak, Create Index ix_comment_id on votes (comment_id, voter_id)
, sıralı bir veri satırı referansı ile bir sıradaki comment_id ve ardından seçmen_id listesini yaratacaktır.
+------------+--------------+---------+
| comment_id | reference_id | row_ref |
+------------+--------------+---------+
| 1 | 4 | ref1 |
| 1 | 5 | ref2 |
| 2 | 4 | ref3 |
| 2 | 5 | ref4 |
| 3 | 1 | ref5 |
+------------+--------------+---------+
Sorguları hızlandırdıklarında kullanın. –
@SteveWellens, uygun indeksleri bir cevapta ve/veya [SQLFiddle] (http://www.sqlfiddle.com/#!2/b562a/13) eklemek için SQL kodunu sağlayabilir misiniz? –
Ayrıca, 'topic_id' dizinine bir dizin eklemeniz gerekir. – Skpd