PDA

View Full Version : کار با جداول با ترافیک بالا



master_pro
پنج شنبه 17 مرداد 1398, 12:01 عصر
یک سری جدول دارم که کاربران بسیار زیادی فیلدهائیو امکان داره در زمان یکسان سعی در تغییرشون داشته باشند
به عنوان مثال امکان داره در یک زمان 100 هزار نفر بخواهند اگر فیلد B وجود دارد فیلد B را حذف کنند و مقدار فیلد A را 1 واحد افزایش دهند
فقط کافیه 2 نفر از این 100 هزار نفر همزمان مشاهده کنند فیلد B وجود دارد و سپس بروند برای حذف آن و اضافه کردن به مقدار A
در این شرایط مقدار فیلد A بیش از 1 واحد افزایش پیدا می کند و اشکال شدیدی به وجود می آید

ali_sed
پنج شنبه 17 مرداد 1398, 14:11 عصر
یک سری جدول دارم که کاربران بسیار زیادی فیلدهائیو امکان داره در زمان یکسان سعی در تغییرشون داشته باشند
به عنوان مثال امکان داره در یک زمان 100 هزار نفر بخواهند اگر فیلد B وجود دارد فیلد B را حذف کنند و مقدار فیلد A را 1 واحد افزایش دهند
فقط کافیه 2 نفر از این 100 هزار نفر همزمان مشاهده کنند فیلد B وجود دارد و سپس بروند برای حذف آن و اضافه کردن به مقدار A
در این شرایط مقدار فیلد A بیش از 1 واحد افزایش پیدا می کند و اشکال شدیدی به وجود می آید

سلام

در مبحث دیتابیس مفهومی به عنوان تراکنش داریم.
برای اینکه به مقدار فیلد آ دوبار اضافه نشه باید حذف فیلد بی و افزایش مقدار آ در یک تراکنش انجام شود و کوئری های بعدی پس از پایان کامل این تراکنش انجام شوند.
برای ایجاد تراکنش می توانید از دستورات زیر استفاده کنید: (کوئری ها و دستورات تنها جهت رساندن مفهوم نوشته شده اند)




mysqli_begin_transaction($link);

//q1
$result = mysqli_query($link, "select B from table");
if(!empty($B)){
//q2
mysqli_query($link, "delete value of field B");
//q3
mysqli_query($link, "increase value of A");
}

mysqli_commit($link);


نتیجه کوئری های 2 و 3 هم مهم است اگر به هر دلیل مقدار یکی از آنها false باشد باید rollback کنید. در ضمن لازمه از try catch هم استفاده کنید تا اگر خطایی رخ داد rollback کنید.


توضیحات دستورات زیر را در منوال php مطالعه فرمایید.
mysqli_begin_transaction
mysqli_commit
mysqli_rollback
mysqli_autocommit

ali_sed
پنج شنبه 17 مرداد 1398, 14:23 عصر
البته نکاتی هم در مورد روش لاک کردن جداول و سطرها در هر انجین وجود دارد که باید به آنها توجه کنید.

به عنوان مثال موتور myisam کل جدول را لاک می کند در حالی که innodb می تواند تنها سطر مربوطه را لاک کند و بقیه کوئری های روی آن جدول بصورت همزمان به کار خود ادامه دهند.

plague
جمعه 18 مرداد 1398, 18:38 عصر
بجای اینکه فیلد رو مستقیما افزایش بدی از تیبل
یک تیبل دیگه بسازمثلا increment_table که توش یک کلید خارجی داشته باشه که وصلش کنه به تیبل اصلی

مثلانام تیبل اصلیت هست

main_table: id , fild_a

ساختار تیبل افزایش دهنده میشه

increment_table : id , main_table_id

که در این ساختار

main_table.id = increment_table.main_table_id


وقتی کسی میخاد فیلد رو افزایش بده بره توی increment_table یه ردیف اضافه کنه
بعد برای increment_table یه trigger مینویسی که وقتی توش یک ردیف اضافه شدبره مقدار فیلد تو تیبل دیگه رو یدونه افزایش بده



CREATE TRIGGER update_fild_on_insert
AFTER INSERT
ON increment_table
FOR EACH ROW
BEGIN

UPDATE main_table SET fild_a= fild_a+ 1 WHERE id = NEW.main_table_id;

END





اینجوری وقتی کسی بخاد مقدار fild_a رو افزایش بده بجای اینکه مستقما تیبل main_table رو آپدیت کنه یک ردیف در تیبل increment_table وارد میکنه


حالا کافیه که توی تیبل increment_table فیلد main_table_id رو unique کنی تا کسی نتونه مقادیر تکراری توش ثبت کنه و فقط یکی ثبت بشه

اگه نمیدونی اینا چی هستن یکم راجب trigger ها و unique index توی mysql مطالعه کن

master_pro
پنج شنبه 14 شهریور 1398, 16:12 عصر
از توضیحات عالی دوستان کمال تشکر دارم
با توجه به موضوع زیر راهنمائی بفرمائید مثلا همون Transaction را چطور پیاده کنم
3 گروه کاربر داریم U1 , U2 , U3
در جدولی 2 نوع رکورد داریم R1 , R2
برخی از U1 ها روی برخی از R1 ها پردازش می کنند
U2 ها 1 ساعت یکبار روی R2 ها پردازش می کنند
U3 ها روی برخی از R2 ها , اگر و تنها اگر در لحظه پردازش U2 ها نیست باید پردازش کنند وگرنه فقط اطلاعات برخی از R2 ها را بخواند

master_pro
جمعه 15 شهریور 1398, 18:00 عصر
نکته قابل ذکر اینه که تا زمانیکه u2 ها پردازششون کاملا پایان نیافته , u3 ها نباید بتونن R2 هارو تغییر بدن , فقط بتونن بخوننشون
پردازش های یوزرهای u2 هم فقط شامل خواندن و انجام تغییرات احتمالی روی R2 ها نمیشه و امکان داره در این بلاک پردازشی رکوئست هم ارسال و دریافت شه و خیلی پردازش های دیگه و بعد از پایان کامل انجام این عملیات U3 ها بتونن روی R2 ها تغییر ایجاد کنند
لطفا راهنمائی بفرمائید ممنون

master_pro
جمعه 15 شهریور 1398, 18:22 عصر
نکته بعدی اینه که در این بلاک پردازشی با بیش از 500 هزار رکورد کار داریم
یعنی اطلاعات این رکوردها تک به تک خونده میشه و با توجه به اطلاعات هر رکود احتمال داره مجددا سلکت ثانویه ای روی مثلا 20 رکورد R2 گرفته شه و اطلاعات مقایسه شه و در نهایت احتمال داره رکورد اولیه حذف شه و در جدولی دیگر درج شه و فیلد امتیاز در جدولی دیگر به روز رسانی شه سپس این عملیات برای هریک از 499 هزار رکورد دیگر انجام میشه و پس از پایان این بلاک پردازشی , R2 ها برای تغییر توسط U3 ها امن و آزاد هستند

master_pro
یک شنبه 17 شهریور 1398, 11:28 صبح
دوستان لطفا راهنمائی بفرمائید

master_pro
چهارشنبه 27 شهریور 1398, 16:02 عصر
دوستان کسی راهنمائی نمیکنه ؟

master_pro
چهارشنبه 24 مهر 1398, 17:46 عصر
گروه تلگرام php اگر کسی داره برام pv کنه ممنون

sunnywebco
جمعه 26 مهر 1398, 16:40 عصر
بهتر از روش های بهینه سازی دیتابیس (mysql) استفاده کنید . برای مثال می توانید از index کردن یک جدول یا حتی تغییر موتور دیتابیس استفاده کنید .
اگر متوجه نشدید با من در تماس باشید .
تیم برنامه نویسی سانی وب (http://sunnyweb.ir)