1. 2
    Veritabanından rastgele sonuçlar getirmek için genelde şöyle bir sorgu kullanırızSELECT * FROM deneme ORDER BY RAND() LIMIT 5Bu sorgu deneme tablosundan 5 adet rastgele sonuç getirir. Fakat bu rastgele sonuçlar getirmek için çok kötü bir yol. Tablonuzda 1...

    Veritabanından rastgele sonuçlar getirmek için genelde şöyle bir sorgu kullanırız

    SELECT * FROM deneme ORDER BY RAND() LIMIT 5

    Bu sorgu deneme tablosundan 5 adet rastgele sonuç getirir. Fakat bu rastgele sonuçlar getirmek için çok kötü bir yol.

    Tablonuzda 100-200 kayıt varsa problem yok da ya yüzbinlerce kayıt varsa?

    Diyelim ki 50 bin satırlık bir tablomuz var ve RAND() fonksiyonu yardımıyla böyle bir sorgu çalıştırdık, arka planda neler olur? 50 bin satırın her biri için random bir sayı oluşturulur, tüm tablo buna göre sıralanır ve istediğiniz kesit bundan sonra getirilir! Tablonuz ne kadar büyükse veritabanına yükleyeceğiniz yük o kadar artacaktır. Tablo büyüdükçe sorgu hızı bakın nasıl düşüyor.

    drmpbsca4pvjqcwcdsig

    Dolayısıyla rastgele sonuçlar getirmek için RAND() kullanmak büyük tablolar için tam bir performans katliamı olacaktır.

    Peki ne yapacağız? Rastgeleliği veritabanı seviyesinde değil yazılım seviyesinde elde edeceğiz. Bunun için kullandığınız yazılım dilinde rastgele sayı üretebilirsiniz. Fakat rastgele üretilen sayının veritabanındaki kayıtlardan çok olmaması gerekiyor, bu yüzden önce tabloda kaç kayıt olduğunu küçük bir sorguyla getirin.

    $toplam_sayi = SELECT COUNT(id) FROM deneme;
    $rastgele_sayi = rand(1, $toplam_sayi);
    SELECT * FROM deneme LIMIT 5 OFFSET $rastgele_sayi;

    Bu şekilde OFFSET'i rastgele bir kayıttan başlatarak rastgele 5 kayıt getiriyoruz. Bir yerine iki sorgu olması kafa karıştırmasın çünkü toplam sayıyı sorgulamak için çalıştırılan sorgu performans açısından sıkıntı yaratmayacak kadar küçük bir işlem ve diğer seçenekden çok daha hızlı.

    Bu yöntemin handikapı rastgele bir başlangıç noktası belirleyip sırasıyla 5 sonuç getirmesidir. Diyelim ki $rastgele_sayi 100 olduğu sürece hep 100'den 105'e kadar olan kayıtlar gelecektir. Eğer bu istenmeyen bir durumsa farklı yollar denenebilir. Böyle bir durumda getirilecek kayıt sayısı kadar rastgele id üretilerek bir sorgu oluşturulabilir.

    // Tablodaki kayıtlardan en büyük id'yi getirelim
    $max_id = SELECT MAX(id) FROM deneme;
    
    /* Yazılım seviyesinde 1 ile $max_id arasında rastgele sayılar üretelim. 
     * Tablonuzda bazı kayıtların silinmiş olma ihtimali yüksektir. 
     * Bu yüzden 5 kayıt getirmek istesek de 3-5 katı kadar rastgele id seçelim.
     */
    for($i = 1; $i < 30; $i++){
        $rastgele_idler[] = rand(1, $max_id);
    }
    
    // Bu id'leri IN() sorgusu içinde çalışabilecek şekilde virgülle ayrılmış satır haline getirelim
    $rastgele_idler = join($rastgele_idler, ',');
    
    // Sorguyu yazalım ve istediğimiz limiti belirleyelim
    SELECT * FROM deneme WHERE id IN ($rastgele_idler) LIMIT 5;

    Bu iki yöntemin RAND() kullanmaktan nasıl daha hızlı olduğunu ilk tablo ile aşağıdakini karşılaştırarak görebiliriz.

    mrlqoviof03f3dhzm1b0

    Bu arada sorguları gerçek bir benchmarka tabi tutmak lazım, ben gelişigüzel konsoldan denedim kabaca gösterebilmek için.

    Random sonuçlar getirmek veritabanları için gördüğünüz gibi biraz problemli. Hatta bildiğim bazı ORM'ler RAND() fonksiyonunu bu sebeple desteklemiyor.

    Hem kendi çözüm yöntemimi aktarmak, hem de başka fikirleri tecrübesi olanlardan almak istedim.

    2
    başlıklar
    9
    takipçiler
    Hakkında
    Veri tabanları birbirleriyle ilişkili bilgilerin depolandığı alanlardır. Bilgi artışıyla birlikte bilgisayarda bilgi depolama ve bilgiye erişim konularında yeni yöntemlere ihtiyaç duyulmuştur. Veri tabanları; büyük miktardaki bilgileri depolamada geleneks...
    Veri tabanları birbirleriyle ilişkili bilgilerin depolandığı alanlardır. Bilgi artışıyla birlikte bilgisayarda bilgi depolama ve bilgiye erişim konularında yeni yöntemlere ihtiyaç duyulmuştur. Veri tabanları; büyük miktardaki bilgileri depolamada geleneksel yöntem olan "dosya-işlem sistemine" alternatif olarak geliştirilmiştir.

    Veri tabanları, veri tabanı yönetim sistemleri aracılığıyla oluşturulur ve yönetilir. Bu sistemlere; Microsoft Access, MySQL, IBM DB2, Informix, Interbase, Microsoft SQL Server, PostgreSQL, Oracle ve Sysbase örnek olarak verilebilir.