MySQL دومین سیستم مدیریت پایگاه داده رابطه ای متن باز محبوب در جهان است. این محبوبیت که باعث شده در سراسر جهان از این سیستم مدیریت پایگاه داده استفاده شود به دلیل عملکرد همواره سریع، قابلیت اطمینان بالا و سهولت در استفاده است. در این مقاله می خواهیم به برخی از best practice های MySQL بپردازیم.
1. همیشه از DataType
مناسب استفاده کنید.
یکی از مهمترین best practice های MySQL، استفاده از نوع داده ها (Datatypes
) بر اساس ماهیت داده ها است. استفاده از نوع داده های نامناسب ممکن است فضای بیشتری مصرف کرده یا خطایی را به وجود آورد.
به عنوان مثال: استفاده از Varchar(20)
به جای نوع داده ی DateTime
برای ذخیره سازی مقادیر زمان، به اشتباهات محاسبات مربوط به زمان منجر می شود. همچنین ممکن است داده های نامعتبری ذخیره شوند.
2. استفاده از CHAR(1)
به جای VARCHAR(1)
VARCHAR(1)
فضای بیشتری را برای ذخیره اطلاعات اشغال می کند، بنابراین اگر شما می خواهید یک کارکتر رشته ای را ذخیره کنید بهتر است از CHAR(1)
استفاده کنید.
3. برای ذخیره ی داده هایی با طول ثابت از نوع داده ی CHAR
استفاده کنید.
به عنوان مثال: اگر طول داده ها کمتر از 1000 باشد، با استفاده از CHAR(1000)
به جای VARCHAR(1000)
فضای کمتری مصرف می شود.
4. استفاده نکردن از فرمت های تاریخ منطقه ای.
هنگام استفاده از نوع داده ی DATETIME
و DATE
، همیشه از فرمت تاریخ YYYY-MM-DD
یا فرمت تاریخ ISO مناسب برای موتور SQL خود استفاده کنید. فرمت های منطقه ای مانند DD-MM-YYYY
یا MM-DD-YYYY
به درستی ذخیره نمی شوند.
5. Index
کردن ستون های کلید.
خوب است که نتیجه ی query های ما با سرعت بیشتری بازگردانده شوند، بنابراین مطمئن شوید که ستون هایی که در JOIN
ها استفاده می شود index
شده باشند.
6. از تابع ها بر روی ستون های index
شده استفاده نکنید.
به عنوان مثال، فرض کنید شما می خواهید اطلاعاتی را دریافت کنید که در آن سه کارکتر اول ستون نام مشتری `علی` باشد. استفاده از query زیر باعث می شود index
ستون مورد استفاده قرار نگیرد.
SELECT * FROM customers WHERE left (customer_name,3)=’علی’
بهتر است به جای استفاده از تابع LEFT
از query زیر استفاده کنیم.
SELECT * FROM customers WHERE customer_name like ‘علی%’
7. از *SELECT
فقط در زمان نیاز استفاده کنید.
اگر جدول شما ستون های زیادی داشته باشد، * SELECT
همه ستون ها را باز می گرداند. این کار زمان پاسخ آهسته تر می کند، به ویژه اگر شما نتیجه را برای یک برنامه front-end ارسال کنید.
در عوض، به صراحت نام ستون هایی که مورد نیازتان است را بنویسید.
7. فقط زمانی که نیاز دارید از ORDER BY
استفاده کنید.
استفاده از این تابع، ممکن است زمان پاسخ دهی در محیط چند کاربره را بیشتر کند.
8. برای بررسی وجود یک داده از EXISTS
استفاده کنید.
برای بررسی وجود یک داده از
If EXISTS(SELECT * from Table WHERE col=’some value’)
به جای
If (SELECT count(*) from Table WHERE col=’some value’)>0
استفاده کنید.
9. Query های select
خود را EXPLAIN
کنید.
اگر از کلمه کلیدی EXPLAIN
استفاده کنید، می توانید بینشی در مورد آنچه MySQL برای اجرای query شما انجام می دهد دریافت کنید. این کار می تواند به شما کمک کند تا شما مشکلات query یا ساختار جدول های خود را بفهمید.
EXPLAIN
گرفتن از query نشان می دهد که در query شما کدام شاخص ها مورد استفاده قرار می گیرند، چگونه جدول اسکن می شود، چگونه داده ها مرتب می شوند و غیره.
برای انجام این کار کافی است عبارت EXPLAIN
را پیش از query خود بنویسید. اگر این کار را در phpMyAdmin انجام دهید نتیجه را در یک جدول مرتب و خوب به شما نشان خواهد داد.
10. وقتی فقط یک ردیف را میخواهید حتما از LIMIT 1
استفاده کنید.
گاهی اوقات از پیش می دانید که شما فقط یک ردیف را در هنگام پرس و جو جداول خود جستجو می کنید. به عنوان مثال، شما ممکن است یک داده ی منحصر به فرد را بخواهید، یا ممکن است فقط وجود یک داده را بررسی کنید.
در چنین مواردی، شما می خواهید از تابع limit
برای افزایش کارایی استفاده کنید.
با استفاده از این تابع موتور پایگاه داده دیگر به سراغ کل جدول یا INDEX ها نمی رود و اولین داده ای که پیدا کند را به عنوان خروجی قرار می دهد. به عنوان مثال به جای استفاده از
SELECT * FROM user WHERE state = ‘Alabama'
از query زیر استفاده کنید:
SELECT * FROM user WHERE state = ‘Alabama’ LIMIT 1
11. استفاده از index
ها و ستون های مشابه برای join ها
برای join کردن تو جدول سعی کنید از ستون هایی استفاده کنید که index
شده اند این کار بر بهینه سازی داخلی عملیات join در MYSQL تاثیر گذار است.
همچنین ستون های مورد استفاده باید از یک نوع داده باشند. به عنوان مثال، اگر شما بخواهید دو جدول را با استفاده از یک ستون DECIMAL و یک ستون INT با هم join کنید، MYSQL نمی تواند از index های موجود استفاده کند.
12. کش (cache) کردن query ها
کش کردن query ها یکی از موثرترین روش های بهبود عملکرد است. اکثر سرورهای MYSQL آن را به طور پیش فرض فعال کرده اند. MYSQL متن بیانیه ی (statement) SELECT
را همراه با نتیجه ی مربوط به آن برای کش یک query ذخیره می کند. اگر سرور بعدا یک بیانیه یکسان را دریافت کند، نتیجه را به جای تجزیه و اجرای این بیانیه از کش بازیابی می کند. کش query ها در session ها به اشتراک گذاشته می شوند، بنابراین یک نتیجه تولید شده توسط یک کاربر می تواند در پاسخ به همان query درخواست شده توسط یک کاربر دیگر ارسال شود.