folder Tahribat.com Forumları
linefolder Database - Veritabanı
linefolder Hızlı Silme İşlemi Mysql



Hızlı Silme İşlemi Mysql

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Claw
    Claw's avatar
    Kayıt Tarihi: 30/Temmuz/2015
    Erkek
    sandman bunu yazdı

    sonuç itibariyle bir işlem yapılacak ve bunu nasıl yaparsan yap bir yük bindirecek. Eğer performans senin için çok önemliyse güncel verileri nosql veritabanlarından birinde tutup arşiv olan daha eskileri ilişkisel bir veritabanında tut.

    mysql sorgusu yerine stored prosedure kullanırsan if kullanabilirsin

    iften kastım şöyle bir şey aynı sorgu içinde grup tablosunda posttan gelen post_grup taki grup id sini karşılaştıracak zaten grup silindiği için bana yok verisini döndürmesi laızm bunu yapamaz mıyız normal mysql de


    Real Eyes Realize Real Lies
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    All hail to Tux
    sandman
    sandman's avatar
    Kayıt Tarihi: 01/Eylül/2005
    Erkek

    dediğime bakarsan yapabilirsin.


    Mühendis kahveyi projeye dönüştüren bir insan evladıdır.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    izleyici
    izleyici's avatar
    Kayıt Tarihi: 26/Mayıs/2011
    Erkek

    eskiden seditio cms için yazılmış bir eklenti vardı bunun mantığı işine yarayabilir

     

    <?PHP
    
    /* ====================
    Seditio - Website engine
    Copyright Neocrome
    http://www.neocrome.net
    
    [BEGIN_SED]
    File=plugins/hizlimesajsilici/hizlimesajsilici.admin.php
    Version=110+ (120 - 121)
    Updated=2007-july-20
    Type=Plugin
    Author=Dvdbil
    Description=
    [END_SED]
    
    [BEGIN_SED_EXTPLUGIN]
    Code=hizlimesajsilici
    Part=admin
    File=hizlimesajsilici.admin
    Hooks=tools
    Tags=
    Order=10
    [END_SED_EXTPLUGIN]
    
    ==================== */
    
    if (!defined('SED_CODE')) { die('Wrong URL.'); }
    
    switch ($a){	case 'kontrol':	sed_check_xp();	$user = sed_import('user','P','TXT',24,TRUE);$sql = sed_sql_query("SELECT user_id, user_name, user_postcount FROM $db_users WHERE user_name LIKE '".sed_sql_prep($user)."' LIMIT 1");
    $plugin_body .= "<h2>Hızlı Mesaj Silici</h2>";$plugin_body .= "<h4>Adım 2/3</h4>";if (sed_sql_numrows($sql)!=0){$row = sed_sql_fetcharray($sql);$plugin_body .= "Kullanıcı adı: ".sed_build_user($row['user_id'],sed_cc($row['user_name']));$plugin_body .= "<br />Mesaj Sayısı: <strong>".$row['user_postcount']."</strong>";
    if ($row['user_postcount']>0){$id = $row['user_id'];$plugin_body .= "<br />Bu kullanıcının tüm mesajlarını sil: <a href=\"admin.php?m=tools&p=hizlimesajsilici&a=sil&id=$id&".sed_xg()."\">EVET</a> | <a href=\"admin.php?m=tools&p=hizlimesajsilici\">HAYIR</a>";}else{$plugin_body .= "<br />Bu kullanıcıya ait mesaj bulunamadı<br /><a href=\"admin.php?m=tools&p=hizlimesajsilici\">GERİ DÖN</a>";
    }$plugin_body .= "<br /><br /><strong>Not:<br /><br /></strong>- Silinen mesajları geri getiremezsiniz.<br />- Silinecek mesaj, konu ilk mesajı olsa dahi ve o konuya ait başkalarının mesajı var ise konu silindiği için o konuya ait diğer kullanıcıların mesajları veritabanında kalır fakat forum sayfalarında bulunmayacaktır.";}else{$plugin_body .= "<strong>Belirttiğiniz kullanıcı adı bulunamadı !</strong><br /><a href=\"admin.php?m=tools&p=hizlimesajsilici\">GERİ DÖN</a>";
    }break;	case 'sil';sed_check_xp();$id = sed_import('id', 'G', 'INT');$plugin_body .= "<h2>Hızlı Mesaj Silici</h2>";$plugin_body .= "<h4>Adım 3/3</h4>";$sql = sed_sql_query("DELETE FROM $db_forum_posts WHERE fp_posterid='$id'");$say = sed_sql_affectedrows();$sql = sed_sql_query("UPDATE $db_users SET user_postcount=user_postcount-$say WHERE user_id='".$id."'");
    $sql = sed_sql_query("DELETE FROM $db_forum_topics WHERE ft_firstposterid='$id'");$say2 = sed_sql_affectedrows();$sql = sed_sql_query("SELECT fs_id FROM $db_forum_sections");while ($row = sed_sql_fetcharray($sql)){
    $sections = $row['fs_id'];sed_forum_resync($sections);}$plugin_body .= "Kullanıcıya ait $say mesaj ve $say2 konu silinmiştir.";$plugin_body .= "<br /><br /><font color=\"#008000\"><strong>İŞLEM BAŞARIYLA TAMAMLANDI.</strong></font>";break;
    default:$plugin_body .= "<h2>Hızlı Mesaj Silici</h2>";$plugin_body .= "<h4>Adım 1/3</h4>";$plugin_body .= "Mesajlarını sileceğiniz üye adını giriniz:";$plugin_body .= "<form action=\"admin.php?m=tools&p=hizlimesajsilici&a=kontrol&".sed_xg()."\" method=\"post\">";
    $plugin_body .= "<input type=\"text\" class=\"text\" name=\"user\" value=\"".$user."\" size=\"16\" maxlength=\"24\" /> ";$plugin_body .= "<input type=\"submit\" class=\"submit\" value=\"Kontrol\" /></form>";break;}
    ?>



    izleyici tarafından 26/Haz/16 20:24 tarihinde düzenlenmiştir

    #hayat bir sifreleme algoritmasından ibaret.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Claw
    Claw's avatar
    Kayıt Tarihi: 30/Temmuz/2015
    Erkek
    izleyici bunu yazdı

    eskiden seditio cms için yazılmış bir eklenti vardı bunun mantığı işine yarayabilir

     

    Mesaj Sayısı: ".$row['user_postcount']."";
    if ($row['user_postcount']>0){$id = $row['user_id'];$plugin_body .= "
    Bu kullanıcının tüm mesajlarını sil: EVET | HAYIR";}else{$plugin_body .= "
    Bu kullanıcıya ait mesaj bulunamadı
    GERİ DÖN"; }$plugin_body .= "

    Not:

    - Silinen mesajları geri getiremezsiniz.
    - Silinecek mesaj, konu ilk mesajı olsa dahi ve o konuya ait başkalarının mesajı var ise konu silindiği için o konuya ait diğer kullanıcıların mesajları veritabanında kalır fakat forum sayfalarında bulunmayacaktır.";}else{$plugin_body .= "Belirttiğiniz kullanıcı adı bulunamadı !
    GERİ DÖN"; }break; case 'sil';sed_check_xp();$id = sed_import('id', 'G', 'INT');$plugin_body .= "

    Hızlı Mesaj Silici

    ";$plugin_body .= "

    Adım 3/3

    ";$sql = sed_sql_query("DELETE FROM $db_forum_posts WHERE fp_posterid='$id'");$say = sed_sql_affectedrows();$sql = sed_sql_query("UPDATE $db_users SET user_postcount=user_postcount-$say WHERE user_id='".$id."'");
    $sql = sed_sql_query("DELETE FROM $db_forum_topics WHERE ft_firstposterid='$id'");$say2 = sed_sql_affectedrows();$sql = sed_sql_query("SELECT fs_id FROM $db_forum_sections");while ($row = sed_sql_fetcharray($sql)){
    $sections = $row['fs_id'];sed_forum_resync($sections);}$plugin_body .= "Kullanıcıya ait $say mesaj ve $say2 konu silinmiştir.";$plugin_body .= "

    İŞLEM BAŞARIYLA TAMAMLANDI.";break; default:$plugin_body .= "

    Hızlı Mesaj Silici

    ";$plugin_body .= "

    Adım 1/3

    ";$plugin_body .= "Mesajlarını sileceğiniz üye adını giriniz:";$plugin_body .= "
    < =""admin.php?m=tools&p=hizlimesajsilici&a=kontrol&".sed_xg.""" method=""post"">"; $plugin_body .= "< class=""text"" maxlength=""24"" name=""user"" size=""16"" =""text"" value=""".$user.""" /> ";$plugin_body .= "< class=""submit"" =""submit"" value=""Kontrol"" />
    ";break;}
    ?>



    İnceledim hocam mantık olarak çok güzel aslında ama bne zaten grubun oluşumunu siliyorum bu olay da sanırım oranın post countunu siliyor vesaire denetleyiciler ile de kontrol ediliyor benim için sorun kullancıının anasayfasında postun gözükmemesini sağlamak


    Real Eyes Realize Real Lies
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Austen
    Austen's avatar
    Kayıt Tarihi: 13/Ağustos/2012
    Erkek

    Bence mysql'in gücünü hafife alıyorsun. 1 dakikada kaç tane sql işlemi yapılır. Eski pentium tipi işlemci üzerinde çalışmıyorsan sıkıntı yok.

    Optimize kod yazdıktan sonra, düzgün şekilde tasarlanmış hiç bir veritabanı seni üzmez. Fakat tam tersi ufacık iş yaptığın kötü dizayn edilmiş bir veritabanı adamı süründürür.

    Arkadaşların da dediği gibi ufak bir boolean bölüm ekleyip 0/1 gösterilsin gösterilmesin şekilde belirtip bunları belirli saatlerde mesela sabahın 5-6'sında otomatik çalışacak hale getir. Peki diyelim günde benzer 3-5 grup silmek istedi. Hepsinin verisi birikince hepsine bir anda işlem yapınca yine avantajlı olmayacak ki? Bu sefer ne yapacaksın mesela mesajlara süre kısıtlaması olabilir. Zaman damgası koyar mesela silinmesi istenen 24 saat dolan mesajları veritabanından silersin. Hem de kullanıcıya mesajlarını geri alma imkanı da verilebilir.

    Ekstradan ciddi bir iş yapıyorsan ve bunlar kullanıcı girdileriyse yasal olarak bazı verileri belirli bir süre tutma sorumluluğun olduğunu unutma. Başka bir yerde (başka diskte vs.) bu silinmesi onaylanan verileri tutabilir, işlem yaptığın sistemden düşürebilirsin.

     

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Claw
    Claw's avatar
    Kayıt Tarihi: 30/Temmuz/2015
    Erkek
    Austen bunu yazdı

    Bence mysql'in gücünü hafife alıyorsun. 1 dakikada kaç tane sql işlemi yapılır. Eski pentium tipi işlemci üzerinde çalışmıyorsan sıkıntı yok.

    Optimize kod yazdıktan sonra, düzgün şekilde tasarlanmış hiç bir veritabanı seni üzmez. Fakat tam tersi ufacık iş yaptığın kötü dizayn edilmiş bir veritabanı adamı süründürür.

    Arkadaşların da dediği gibi ufak bir boolean bölüm ekleyip 0/1 gösterilsin gösterilmesin şekilde belirtip bunları belirli saatlerde mesela sabahın 5-6'sında otomatik çalışacak hale getir. Peki diyelim günde benzer 3-5 grup silmek istedi. Hepsinin verisi birikince hepsine bir anda işlem yapınca yine avantajlı olmayacak ki? Bu sefer ne yapacaksın mesela mesajlara süre kısıtlaması olabilir. Zaman damgası koyar mesela silinmesi istenen 24 saat dolan mesajları veritabanından silersin. Hem de kullanıcıya mesajlarını geri alma imkanı da verilebilir.

    Ekstradan ciddi bir iş yapıyorsan ve bunlar kullanıcı girdileriyse yasal olarak bazı verileri belirli bir süre tutma sorumluluğun olduğunu unutma. Başka bir yerde (başka diskte vs.) bu silinmesi onaylanan verileri tutabilir, işlem yaptığın sistemden düşürebilirsin.

     

    Hocam peki UPDATE ile 2k gönderi hatta 4-5 grup aynı anda sişlme işlemi verdi diyelim 10k gönderiyi update set ile kilit booleanını 1 verdirsek yine uzun sürmeyecekmidir.


    Real Eyes Realize Real Lies
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Austen
    Austen's avatar
    Kayıt Tarihi: 13/Ağustos/2012
    Erkek

    İşte burada veritabanı tasarımı ortaya çıkıyor.

    Diyelim bir başlığa 2000 mesaj geldi. Bunda her satıra başlık id'si girmektense ekstradan bir başlıklar bölümü açıp unique bir id vermek ve daha sonra mesajları belirtmek için o id adresini mesajlarında kullanmak yararlı olabilir.

    Diyelim başlık kilitlenecek ya da mesajları gösterilmeyecek. Başlıklar bölümündeki id'yi iptal edip sayfana başlıkları çekerken sadece başlıklar bölümündeki id'yi kontrol ettirirsen atlanan id'ye ait hiç bir mesaj çekilmez. Yani 2000 mesaj yerine tek bir satıra işlem yaparsın. Veri filtreleme esnasında bu veriler çekilmez.

    Tabi şimdi misal olması için böyle dedim. Oturup akıllıca tasarlansa daha mantıklı bir yolu bulunabilir. Çok uzun süredir veritabanı tasarımı yapmadım. Ama biraz kafa yordun mu daime daha akıllıca bir yöntem ortaya çıkıyordu.

  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Claw
    Claw's avatar
    Kayıt Tarihi: 30/Temmuz/2015
    Erkek
    Austen bunu yazdı

    İşte burada veritabanı tasarımı ortaya çıkıyor.

    Diyelim bir başlığa 2000 mesaj geldi. Bunda her satıra başlık id'si girmektense ekstradan bir başlıklar bölümü açıp unique bir id vermek ve daha sonra mesajları belirtmek için o id adresini mesajlarında kullanmak yararlı olabilir.

    Diyelim başlık kilitlenecek ya da mesajları gösterilmeyecek. Başlıklar bölümündeki id'yi iptal edip sayfana başlıkları çekerken sadece başlıklar bölümündeki id'yi kontrol ettirirsen atlanan id'ye ait hiç bir mesaj çekilmez. Yani 2000 mesaj yerine tek bir satıra işlem yaparsın. Veri filtreleme esnasında bu veriler çekilmez.

    Tabi şimdi misal olması için böyle dedim. Oturup akıllıca tasarlansa daha mantıklı bir yolu bulunabilir. Çok uzun süredir veritabanı tasarımı yapmadım. Ama biraz kafa yordun mu daime daha akıllıca bir yöntem ortaya çıkıyordu.

    Peki grup bilgisinde kilitlendi diyelim yada silindi diyelim, bu grubun postları görünmeyecek ancak benim yine if ile sql içinde kontrol edebilmem lazım yoksa daha fazla gör e basmadna öcne bana gelen 1. sayfada ilk 7 post silinen gruptan geldiyse boş gözükecek yani o kilitlenmiş grubun postlarını çekmemem gerekiyor.


    Real Eyes Realize Real Lies
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ZoRKaYa
    ZoRKaYa's avatar
    Kayıt Tarihi: 18/Eylül/2007
    Erkek
    Claw bunu yazdı
    Austen bunu yazdı

    İşte burada veritabanı tasarımı ortaya çıkıyor.

    Diyelim bir başlığa 2000 mesaj geldi. Bunda her satıra başlık id'si girmektense ekstradan bir başlıklar bölümü açıp unique bir id vermek ve daha sonra mesajları belirtmek için o id adresini mesajlarında kullanmak yararlı olabilir.

    Diyelim başlık kilitlenecek ya da mesajları gösterilmeyecek. Başlıklar bölümündeki id'yi iptal edip sayfana başlıkları çekerken sadece başlıklar bölümündeki id'yi kontrol ettirirsen atlanan id'ye ait hiç bir mesaj çekilmez. Yani 2000 mesaj yerine tek bir satıra işlem yaparsın. Veri filtreleme esnasında bu veriler çekilmez.

    Tabi şimdi misal olması için böyle dedim. Oturup akıllıca tasarlansa daha mantıklı bir yolu bulunabilir. Çok uzun süredir veritabanı tasarımı yapmadım. Ama biraz kafa yordun mu daime daha akıllıca bir yöntem ortaya çıkıyordu.

    Peki grup bilgisinde kilitlendi diyelim yada silindi diyelim, bu grubun postları görünmeyecek ancak benim yine if ile sql içinde kontrol edebilmem lazım yoksa daha fazla gör e basmadna öcne bana gelen 1. sayfada ilk 7 post silinen gruptan geldiyse boş gözükecek yani o kilitlenmiş grubun postlarını çekmemem gerekiyor.

    Hocam konu ilgimi cekti. Fakat halen daha if niye kullaniyorsun cozemedim. Yani bir boolean ile active grup mu tutup sonra o grubun profil sayfasina girildiginde eger false sa, boyle bir grup yok deyip o guruba ait icerikleri ceken query ni calistirmazsin olur biter. Bunu neden database tarafinda halletmeye calisiyorsun. 

     

    Eger anasayfa veya timeline gibi bir yerde son icerikleri gosteriyorsan da join ile icerik ve grup tablosunu birlestirip active=true olanlar diye sorgulasan ne olur mesela. 

    Boylelikle her bi icerik icin silinecek diye update yapmana gerek kalmaz. Silinmis gruplarin iceriklerini de illa silmek istiyorsan arkadaslarin da onerdigi gibi, sistemin rahat oldugu zamanlar arkaplanda silersin. 

     


    echo "imzanız özel karakter içermemelidir";
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ozgunlu
    ozgunlu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 11/Kasım/2011
    Erkek

    Şimdi relational database de tablo mantığını şöyle kurarsan bir sorun kalmaz.

    Gruplar diye bir tablon olur ayrıca bununla ilişkili grup_postları gibi ayrı bir tablon olur.

    Sen gidip gruplar dan grubu sildiğin, parent id yok olacağı için, grup silinmiş olur.

    postlar için ayrıca bir zamanlayıcı oluşturup kaldırabilirsin ama bu davranış kullanıcıyı bağlamaz.

    Edit : İkinci soruna istinaden;

    Şimdi gruplar tablon şöyle olur : Grup Adı - Grup Zımbırtısı - Grup Pıtırcıkları - State

    Gruplar postun da şöyle : Grup Id - Post

    Sen adamın ekranında paylaşırken, ekranında grup adını da yazacağın için; mecburen gruplar tablosuyla join etmen gerekir. Fakat join ederken grupların state' ini kontrol edersen,  "aaa aaa o da bu silinmiş" diyip onu sana getirmez.

    Ufak sorgu : 

    SELECT * FROM groups AS g INNER JOIN group_posts AS gp ON gp.gid = g.id WHERE g.state <> deleted

     

    ozgunlu tarafından 27/Haz/16 05:18 tarihinde düzenlenmiştir

    Hello, i am nothing. I come from Neverland.
Toplam Hit: 2387 Toplam Mesaj: 22
mysql delete