چگونه استفاده از CPU را 20٪ کاهش دادم: 5 روش اثبات شده بهینه سازی SQL

Summarize this content to 400 words in Persian Lang
هفته گذشته، تیم من با یک مشکل جدی با RDS ما مواجه شد، زمانی که استفاده از CPU به طور چشمگیری افزایش یافت، که باعث اختلالات قابل توجهی در سیستم ما شد و مشتریان ما را تحت تاثیر قرار داد. پس از بررسی، ما پرس و جوهای SQL ناکارآمد را به عنوان یکی از دلایل اصلی شناسایی کردیم. در اینجا پنج اقدام کلیدی است که ما برای بهبود عملکرد انجام دادیم.
نکته اول: شناسایی علت
این مشکل به وضوح با SQL مرتبط بود، اما ما باید منبع دقیق را مشخص میکردیم – خواه خوشه، پایگاه داده یا نمونه خاصی باشد (مستر یا برده). خوشبختانه، AWS ابزارهای قوی ارائه می دهد که به ما امکان می دهد منابع فشرده ترین پرس و جوها را ردیابی کنیم.
رویکرد
استفاده کارآمد از شاخص ها
ما بررسی کاملی از همه شاخصها در جداول آسیبدیده انجام دادیم. این شامل تجزیه و تحلیل برنامه های اجرای پرس و جو برای شناسایی هر گونه فهرست گم شده یا استفاده نشده است. سپس DDL (زبان تعریف داده ها) را برای اضافه کردن فهرست ها در صورت لزوم به روز کردیم و موارد اضافی را حذف کردیم. این به تسریع بازیابی داده ها با اجازه دادن به پایگاه داده برای مکان یابی سریعتر رکوردها کمک کرد.
بهینه سازی پیوستن ها
ما پرس و جوهای مربوط به اتصالات چند جدولی را به دقت بررسی کردیم. با بررسی روابط و جریان دادهها بین جداول، فرصتهایی را برای کاهش تعداد پیوستها شناسایی کردیم، بهویژه در مواردی که اتصالهای خاصی غیرضروری بودند یا میتوانستند با زیرپرسوهای کارآمدتر جایگزین شوند. ما همچنین اطمینان حاصل کردیم که ستونهای به هم پیوسته برای بهبود عملکرد اتصال به درستی ایندکس شدهاند.
محدود کردن بازیابی داده ها
ما متوجه شدیم که چندین پرسوجو حجم زیادی از دادهها را دریافت میکنند، که بسیاری از آنها غیر ضروری بودند. برای کاهش این موضوع استفاده کردیم LIMIT بندهایی برای محدود کردن تعداد ردیف های برگشتی توسط پرس و جوها. ما همچنین عبارات SELECT را برای بازیابی تنها ستون های خاص مورد نیاز، به جای استفاده، بهینه کردیم SELECT *، که همه ستون ها را بازیابی می کند و می تواند منجر به ناکارآمدی شود.
پیاده سازی Query Caching
برای پرس و جوهایی که اغلب با پارامترهای یکسان اجرا می شدند، ذخیره پرس و جو را فعال کردیم. این به پایگاه داده اجازه می دهد تا مجموعه نتایج این پرس و جوها را ذخیره کند، بنابراین اجرای بعدی می تواند از حافظه پنهان به جای اجرای مجدد کل پرس و جو ارائه شود. ما به دقت تنظیمات انقضای حافظه پنهان و عدم اعتبار را پیکربندی کردیم تا ضمن به حداکثر رساندن عملکرد، از تازگی داده ها اطمینان حاصل کنیم.
بهینه سازی طراحی پایگاه داده
ما طراحی کلی پایگاه داده را با تمرکز بر مناطقی که باعث تنگناها میشوند، بازبینی کردیم. این شامل عادی سازی جداول خاص برای کاهش افزونگی و بهبود یکپارچگی داده ها، و همچنین غیرعادی سازی در موارد مناسب برای کاهش نیاز به اتصال های پیچیده بود. ما همچنین معماری خود را با افزودن کپی های خوانده شده (نمونه های برده) برای تخلیه عملیات خواندن از پایگاه داده اصلی، متعادل کردن بار و بهبود عملکرد، مقیاس بندی کردیم.
نتیجه
پس از اجرای این بهینه سازی ها شاهد کاهش 20 درصدی بودیم استفاده از CPU، منجر به یک سیستم پایدارتر و کارآمدتر می شود.
هفته گذشته، تیم من با یک مشکل جدی با RDS ما مواجه شد، زمانی که استفاده از CPU به طور چشمگیری افزایش یافت، که باعث اختلالات قابل توجهی در سیستم ما شد و مشتریان ما را تحت تاثیر قرار داد. پس از بررسی، ما پرس و جوهای SQL ناکارآمد را به عنوان یکی از دلایل اصلی شناسایی کردیم. در اینجا پنج اقدام کلیدی است که ما برای بهبود عملکرد انجام دادیم.
نکته اول: شناسایی علت
این مشکل به وضوح با SQL مرتبط بود، اما ما باید منبع دقیق را مشخص میکردیم – خواه خوشه، پایگاه داده یا نمونه خاصی باشد (مستر یا برده). خوشبختانه، AWS ابزارهای قوی ارائه می دهد که به ما امکان می دهد منابع فشرده ترین پرس و جوها را ردیابی کنیم.
رویکرد
-
استفاده کارآمد از شاخص ها
- ما بررسی کاملی از همه شاخصها در جداول آسیبدیده انجام دادیم. این شامل تجزیه و تحلیل برنامه های اجرای پرس و جو برای شناسایی هر گونه فهرست گم شده یا استفاده نشده است. سپس DDL (زبان تعریف داده ها) را برای اضافه کردن فهرست ها در صورت لزوم به روز کردیم و موارد اضافی را حذف کردیم. این به تسریع بازیابی داده ها با اجازه دادن به پایگاه داده برای مکان یابی سریعتر رکوردها کمک کرد.
-
بهینه سازی پیوستن ها
- ما پرس و جوهای مربوط به اتصالات چند جدولی را به دقت بررسی کردیم. با بررسی روابط و جریان دادهها بین جداول، فرصتهایی را برای کاهش تعداد پیوستها شناسایی کردیم، بهویژه در مواردی که اتصالهای خاصی غیرضروری بودند یا میتوانستند با زیرپرسوهای کارآمدتر جایگزین شوند. ما همچنین اطمینان حاصل کردیم که ستونهای به هم پیوسته برای بهبود عملکرد اتصال به درستی ایندکس شدهاند.
-
محدود کردن بازیابی داده ها
- ما متوجه شدیم که چندین پرسوجو حجم زیادی از دادهها را دریافت میکنند، که بسیاری از آنها غیر ضروری بودند. برای کاهش این موضوع استفاده کردیم
LIMIT
بندهایی برای محدود کردن تعداد ردیف های برگشتی توسط پرس و جوها. ما همچنین عبارات SELECT را برای بازیابی تنها ستون های خاص مورد نیاز، به جای استفاده، بهینه کردیمSELECT *
، که همه ستون ها را بازیابی می کند و می تواند منجر به ناکارآمدی شود.
- ما متوجه شدیم که چندین پرسوجو حجم زیادی از دادهها را دریافت میکنند، که بسیاری از آنها غیر ضروری بودند. برای کاهش این موضوع استفاده کردیم
-
پیاده سازی Query Caching
- برای پرس و جوهایی که اغلب با پارامترهای یکسان اجرا می شدند، ذخیره پرس و جو را فعال کردیم. این به پایگاه داده اجازه می دهد تا مجموعه نتایج این پرس و جوها را ذخیره کند، بنابراین اجرای بعدی می تواند از حافظه پنهان به جای اجرای مجدد کل پرس و جو ارائه شود. ما به دقت تنظیمات انقضای حافظه پنهان و عدم اعتبار را پیکربندی کردیم تا ضمن به حداکثر رساندن عملکرد، از تازگی داده ها اطمینان حاصل کنیم.
-
بهینه سازی طراحی پایگاه داده
- ما طراحی کلی پایگاه داده را با تمرکز بر مناطقی که باعث تنگناها میشوند، بازبینی کردیم. این شامل عادی سازی جداول خاص برای کاهش افزونگی و بهبود یکپارچگی داده ها، و همچنین غیرعادی سازی در موارد مناسب برای کاهش نیاز به اتصال های پیچیده بود. ما همچنین معماری خود را با افزودن کپی های خوانده شده (نمونه های برده) برای تخلیه عملیات خواندن از پایگاه داده اصلی، متعادل کردن بار و بهبود عملکرد، مقیاس بندی کردیم.
نتیجه
- پس از اجرای این بهینه سازی ها شاهد کاهش 20 درصدی بودیم استفاده از CPU، منجر به یک سیستم پایدارتر و کارآمدتر می شود.