Delfins Posted October 13, 2006 Report Share Posted October 13, 2006 e-remit, tieši tur arī problēma, ja tu bazīsi visu vienā tabulā, tava `minimālā unikālā ID` notiekšana aizņems daudz resursu (teiksim pa 1.000.000 ierakstu tabulu rakņāties) It kā jau liekas, kas tur, nieks vien ir sameklēt... bet tad kad tev kritīs pieprasījumi kaudzēm, nograus serveri. Link to comment Share on other sites More sharing options...
e-remit Posted October 13, 2006 Report Share Posted October 13, 2006 (edited) e-remit, tieši tur arī problēma, ja tu bazīsi visu vienā tabulā, tava `minimālā unikālā ID` notiekšana aizņems daudz resursu (teiksim pa 1.000.000 ierakstu tabulu rakņāties) It kā jau liekas, kas tur, nieks vien ir sameklēt... bet tad kad tev kritīs pieprasījumi kaudzēm, nograus serveri. tad vienkāršāk varētu būt Tb_Main (id normals_id, others citi_lauki); Tb_SMS_Id (id, main_id areja_atslega_uz_main_id); un algoritms: 1) meklē SELECT MIN(id) FROM Tb_SMS_Id WHERE main_id IS NULL 2a) ja 1. atrada, tad šajā ierakstā aizpilta Tb_SMS_Id.main_id ar Tb_Main.id 2b) ja 1. neatrada, izveido jaunu rindu Tb_SMS_Id (auto_increment), kurā aizpilda Tb_SMS_Id.main_id. 3) kad vairs nevajag, UPDATE Tb_SMS_Id SET main_id=NULL; Ja ļoti vajag, Tb_Main var glabāt arī sms_id bez ārējās atslēgas un DateTime. Edited October 13, 2006 by e-remit Link to comment Share on other sites More sharing options...
Roze Posted October 13, 2006 Author Report Share Posted October 13, 2006 1) meklē SELECT MIN(id) FROM Tb_SMS_Id WHERE main_id IS NULL 2a) ja 1. atrada, tad šajā ierakstā aizpilta Tb_SMS_Id.main_id ar Tb_Main.id 2b) ja 1. neatrada, izveido jaunu rindu Tb_SMS_Id (auto_increment), kurā aizpilda Tb_SMS_Id.main_id. Problēma ir ka šis nav atomic / thread safe (kas tika jau iztirzāts sākuma postos :) ).. Proti starp punktu 1. un punktu 2. var izpildīties N citi MIN(id) pieprasījumi, kas nozīmē ka 2. punktu izpildot MIN(id) nebūs vairs nekāds unikālais bet aizņemts jau N reizes.. Un nav svarīgi vai tas ir vienas vai divi tabulu ietvaros .. Protams var taisīt ciklu kas mēģina šādas darbības izpildīti kamēr tiešām 2. punktā ieliktais MIN(ID) tiešām ir unikāls, bet tas ir pārlieku liels overheads.. Bet tika atrisināts savādāk lai MySQL pats handlē šādu situāciju neizmantojot lockus. Link to comment Share on other sites More sharing options...
e-remit Posted October 13, 2006 Report Share Posted October 13, 2006 Problēma ir ka šis nav atomic / thread safe (kas tika jau iztirzāts sākuma postos :) ).. Bet tika atrisināts savādāk lai MySQL pats handlē šādu situāciju neizmantojot lockus. Doma bija (moš ne līdz galam izsacīta): UPDATE tb_sms SET main_id = :1 WHERE id = (SELECT MIN(id) FROM tb_sms WHERE main_id IS NULL); t.i. vienā SQL teikumā un nebūs nekādu problēmu ar paralēlām sesijām. Tiesa, nezinu, vai tas teikums atbilst MySQL sintaksei. Ja jau atrisināts, tad ok, nav vairs ko... ;) Link to comment Share on other sites More sharing options...
Recommended Posts