7.1 Endekslerin ortaya çıkma nedenleri

Veritabanlarının olamayacağı bir diğer önemli şey de dizinlerdir.

Kullanıcı tablosunda 10 milyon kullanıcının olduğu bir durum hayal edin ve siz 90'ın üzerinde seviyeye sahip herkesi görüntülemek istiyorsunuz. Bu sorguyu yazmak çok basit:

SELECT * FROM user WHERE level > 90

Harika, talebi bir dakikadan kısa sürede yazdık. Ve bu sorguyu SQL sunucusundan yürütmek ne kadar sürer? Böyle bir sorguyu yürütmek için 10 milyon kayıttan geçmesi gerekecek ve sadece bir kayıt olsa bile çok zaman alacaktır.

Java'da benzer bir görevi nasıl yapardık? Önce kullanıcı koleksiyonunu seviyeye göre sıralardık ve ardından bir ikili arama kullanarak gerekli kayıtları çok hızlı bir şekilde bulabiliriz. Umarım ne olduğunu açıklamama gerek yoktur?

Harika, peki ya şimdi kayıt tarihi 2020'den önce olan kullanıcıları seçmemiz gerekirse? Kayıt tarihine göre tekrar sıralayın ve ikili aramayı kullanın.

Evet, bir alanda bir kez değil, sık sık bir filtre uygularsak, verileri bu alana göre sıralanmış olarak depolamak çok yararlı olacaktır.

Ve farklı alanlara göre aynı anda sıralanan veriler nasıl saklanır?

Ve cevap çok basit - verilerin kendisini değil, dizinlerini bazı küresel tablolarda saklamanız gerekir.

Diyelim ki id'ye sahip 10 kullanıcı var: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Ve onları seviyeye göre sıralamaya karar verirsiniz, o zaman kimliklerinin dizisi şu şekilde olur, örneğin: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Ve onları tarihe göre sıralarsak, örneğin şunu elde ederiz: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Bu kimliğin dizilerine dizinler denir . Öğelerin kendileri büyük, onlara dokunmuyoruz. Java'da nesnelere dokunmayız, onların referanslarını saklarız; SQL'de gerçek dizilere dokunmayız, onların numaralarını saklarız.

Bunu Java kodunda yeniden yazayım:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Koleksiyonları sıralamak, gerçek öğeleri taşımak anlamına gelmez. Koleksiyon, gerçek nesneleri saklamaz, ancak onlara bağlar. Aynısı SQL tabloları için de geçerlidir. Gerçek çizgiler kendilerine yalan söyler ve yalan söyler.

Ve bir alan için sık sık seçim yapmamız gerektiğinde, tabloya başka bir dizin ekleriz (Java'daki yeni bir koleksiyona benzer) ve tablonun satırlarını sıralar, sıralanmış düzenlerini özel bir dizin dosyasında saklarız.

Umarım Java karşılaştırması biraz yardımcı olmuştur. Biraz pratik - ve sizin için dizinlerin kullanımı da en bariz çözüm olacaktır.

7.2 Bir tabloya dizin ekleme

Dizin, tablo oluşturulurken hemen belirtilebilir veya daha sonra eklenebilir. Çoğu zaman, gerçekleşen ikinci senaryodur - tablo boyutu büyüdükçe ve veri örneklemesi yavaşladıkça dizinler eklenir.

Bir tabloya indeks eklemek çok basittir:

ALTER TABLE table
    ADD INDEX index_name (column);

Aynı anda birden çok sütundaki kayıtları sık sık ararsanız, bir bileşik dizin belirtebilirsiniz: SQL, onu oluşturmak için birden çok sütun kullanır.

Bir tabloya bileşik dizin eklemek de çok basittir:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Dizinler çok fazla disk alanı kaplar, bu nedenle artık bir dizine ihtiyacınız yoksa onu istediğiniz zaman kaldırabilirsiniz:

ALTER TABLE table
    DROP INDEX index_name;

Dizinlerin kendileri, veritabanının oldukça gizli bir parçasıdır. Sorgu yazma biçimini hiçbir şekilde etkilemezler. Sadece varlıkları veri örneklemeyi hızlandırır ve bunların eklenmesini ve yedeklenmesini yavaşlatır.

Ancak günümüz dünyasında hızın ne kadar önemli olduğunu ve disk alanının ne kadar ucuz olduğunu göz önünde bulundurarak, tüm durumlar için dizin eklemekten çekinmeyin. beni affedin adminler...