Jump to content
php.lv forumi

Small ID reuse


Roze

Recommended Posts

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

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 by e-remit
Link to comment
Share on other sites

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

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

×
×
  • Create New...