نمایش نتایج 1 تا 11 از 11

نام تاپیک: کار با جداول با ترافیک بالا

  1. #1

    کار با جداول با ترافیک بالا

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

  2. #2

    نقل قول: کار با جداول با ترافیک بالا

    نقل قول نوشته شده توسط master_pro مشاهده تاپیک
    یک سری جدول دارم که کاربران بسیار زیادی فیلدهائیو امکان داره در زمان یکسان سعی در تغییرشون داشته باشند
    به عنوان مثال امکان داره در یک زمان 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:25 عصر

  3. #3

    نقل قول: کار با جداول با ترافیک بالا

    البته نکاتی هم در مورد روش لاک کردن جداول و سطرها در هر انجین وجود دارد که باید به آنها توجه کنید.

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

  4. #4
    کاربر دائمی آواتار plague
    تاریخ عضویت
    آبان 1388
    محل زندگی
    اهواز
    پست
    2,360

    نقل قول: کار با جداول با ترافیک بالا

    بجای اینکه فیلد رو مستقیما افزایش بدی از تیبل
    یک تیبل دیگه بسازمثلا 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 مطالعه کن

  5. #5

    نقل قول: کار با جداول با ترافیک بالا

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

  6. #6

    نقل قول: کار با جداول با ترافیک بالا

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

  7. #7

    نقل قول: کار با جداول با ترافیک بالا

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

  8. #8

    نقل قول: کار با جداول با ترافیک بالا

    دوستان لطفا راهنمائی بفرمائید

  9. #9

    نقل قول: کار با جداول با ترافیک بالا

    دوستان کسی راهنمائی نمیکنه ؟

  10. #10

    نقل قول: کار با جداول با ترافیک بالا

    گروه تلگرام php اگر کسی داره برام pv کنه ممنون

  11. #11

    نقل قول: کار با جداول با ترافیک بالا

    بهتر از روش های بهینه سازی دیتابیس (mysql) استفاده کنید . برای مثال می توانید از index کردن یک جدول یا حتی تغییر موتور دیتابیس استفاده کنید .
    اگر متوجه نشدید با من در تماس باشید .
    تیم برنامه نویسی سانی وب

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •