Hızlı Silme İşlemi Mysql
-
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
-
dediğime bakarsan yapabilirsin.
-
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 -
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
-
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.
-
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.
-
İş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.
-
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.
-
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.
-
Ş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