نکات برنامه‌نویسی

نکات برنامه‌نویسی و رایانه‌ای - امیرمسعود ایرانی

نکات برنامه‌نویسی

نکات برنامه‌نویسی و رایانه‌ای - امیرمسعود ایرانی

۵ مطلب با کلمه‌ی کلیدی «mysql» ثبت شده است

انتخاب یک ردیف از میان هر گروه از ردیف‌ها در MySQL

امیرمسعود ایرانی | چهارشنبه, ۱۶ آبان ۱۳۹۷، ۰۳:۴۴ ق.ظ | ۰ نظر

اگر بخواهیم در جدولی که شامل ردیف‌های متعدد متصل به یک جدول خارجی است، ردیف‌ها را گروه‌بندی کنیم و از هر گروه یک ردیف را با شرطی خاص استخراج کنیم، روش‌های متنوع و با مزایا و معایب مختلفی وجود دارند.

برای مثال فرض کنید جدولی برای محصولات و جدولی برای قیمت محصول در طول زمان ایجاد کرده‌ایم. اگر بخواهیم آخرین قیمت ثبت شده برای تمام محصولات را یکجا دریافت کنیم،لازم است تا راهی برای بازخوانی این اطلاعات پیدا کنیم.

یکی از کارآمدترین روش‌ها، استفاده از روش زیر است که در نسخه‌های مختلف MySQL و سایر پایگاه‌های داده به خوبی کار می‌کند.

select p1.* from prices p1
left join prices p2
on( p1.product_id = p2.product_id and p1.created_at < p2.created_at )
where p2.created_at is null

در این روش جدول قیمت‌ها را با استفاده از left join به خودش متصل می‌کنیم. اتصال با این شرط است که ردیف‌ها مربوط به یک محصول باشند و تاریخ ثبت قیمت در جدول اول از تاریخ ثبت قیمت در جدول دوم قدیمی‌تر باشد.

سپس روی نتایج به دست آمده شرط می‌گذاریم که ستون تاریخ در جدول دوم NULL باشد.

به عبارت دیگر، در این روش ابتدا ردیف‌هایی که تاریخ جدول اول از تاریخ جدول دوم قدیمی‌تر است پیدا می‌شوند و اگر تاریخ ثبت شده در جدول اول قدیمی‌تر از هیچ تاریخی در جدول دوم نباشد( مساوی جدیدترین تاریخ باشد ) همان ستون با دستور where فیلتر می‌شود

  • امیرمسعود ایرانی

ایندکس چند ستونی( Multi-Column Index ) در MySQL

امیرمسعود ایرانی | يكشنبه, ۲۰ ارديبهشت ۱۳۹۴، ۰۵:۴۰ ب.ظ | ۰ نظر

استفاده از ایندکس‌ها در پایگاه داده به دو منظور، جستجوی سریع و مرتب‌سازی سریع به انجام می‌رسد.

برای مثال اگر بخواهیم، در جدول کاربران، کاربری با شماره ملی 1234567890 را بیابیم، با ایندکس گذاری روی ستون کد ملی، این جستجو در زمانی بسیار کوتاه به نتیجه می‌رسد.

یا چنانچه بخواهیم دانش‌آموزان را بر اساس معدل مرتب کنیم و سه نفر نخست را جدا کنیم، استفاده از ایندکس روی ستون معدل سبب به نتیجه‌رسیدن سریع خواهد شد.

نبودن ایندکس در حالت‌های بالا سبب می‌شود، پایگاه داده تمام ردیف‌های پایگاه را برای یافتن ردیف‌های مورد نظر ما جستجو کند و هر چه حجم اطلاعات در جدول مورد نظر بیشتر باشد، زمان بیشتری صرف این کار خواهد شد.


نوع دیگری از ایندکس‌ها، ایندکس‌های چند ستونی یا Multi-Column Index ها هستند.

این نوع ایندکس به صورت ترکیبی از چند ستون ساخته می‌شود. برای مثال «شماره ملی و معدل». یا «شناسه و نام خانوادگی».

مورد استفاده از ایندکس‌های چند ستونی هنگامی است که بخواهیم، اطلاعات را از پایگاه داده با شرط‌های ترکیبی بازخوانی کنیم. برای مثال تمام کاربرانی که سال تولدشان کمتر از ۱۳۸۰ است و معدلشان بیش از ۱۹ است.

مزیت ایندکس‌های ترکیبی در استفاده از چپ به راست است. در مثال بالا، چنانچه روی ستون‌های «سال تولد» و «معدل» ایندکس ترکیبی ثبت کنیم، جستجوی ستون «معدل» به تنهایی افزایش سرعتی نخواهد داشت ولی جستجوی ستون «سال تولد» به دلیل اینکه در ابتدا آمده با سرعت زیاد به انجام خواهد رسید.

ایندکس‌های چند ستونی علاوه بر مزیت‌های ایندکس‌های تک ستونی، مزیت‌دیگری نیز می‌توانند داشته باشند.

این مزیت هنگامی است که تنها اطلاعات موجود در ایندکس چند ستونی را SELECT کنیم.

برای مثال، جستجو برای دانش‌آموزانی که سال تولد ۱۳۸۰ دارند و SELECT کردن تنها ستون معدل آن‌ها، با سرعت بسیار زیاد به انجام می‌رسد. زیرا نیازی به مراجعه به دیسک سخت برای پیدا کردن تک تک ردیف‌های دارای شرط نیست و اطلاعات مورد نیاز قبلا در ایندکس موجود است

  • امیرمسعود ایرانی

حذف Binary Log در MySQL

امیرمسعود ایرانی | يكشنبه, ۶ ارديبهشت ۱۳۹۴، ۱۱:۴۶ ب.ظ | ۰ نظر

Binary Log چیست؟

Binary Log در MySQL فایل‌هایی هستند که تاریخچه‌ای از تمام تغییرات صورت گرفته روی بانک اطلاعاتی را در خود نگهداری می‌کنند. این تغییرات می‌تواند در هنگام استفاده از سرورهای موازی برای همزمان سازی مورد استفاده قرار بگیرد. همچنین برای بازیابی و تعمیر بانک اطلاعاتی، وجود این تاریخچه بسیار مفید است.

بدیهی است که نگهداری این تاریخچه هنگامی که به آن نیازی نیست، علاوه بر کاهش سرعت عملکرد بانک اطلاعاتی، باعث اتلاف فضای دیسک نیز می‌شود.

فایل‌های Binary Log با نام‌هایی شبیه mysql-bin.000001 در کنار فایل‌های اطلاعاتی MySQL ذخیره می‌شود.

حذف Binary Log

برای حذف این فایل‌ها می‌توان از نگارش CLI یا خط فرمان MySQL کمک گرفت

برای این منظور به محیط خط فرمان مراجعه کنید و دستورات زیر را اجرا نمایید.

C:\.....> mysql --user=root --password=
mysql> reset master;
mysql> exit
خط نخست در قطعه کد بالا، نگارش خط فرمان mysql را با نام کاربری و رمز پیش‌فرض اجرا می‌کند
در خط دوم که محیط اجرای دستورات mysql است، وضعیت Master Replication یا پایگاه داده مرکزی را به حالت خام برمی‌گردانیم و در نتیجه فایل‌های Binary Log حذف خواهند شد.

فراموش نکنید که پیش از انجام این کار از پایگاه داده نسخه‌ی پشتیبان تهیه کنید زیرا در صورت هرگونه خرابی، تعمیر پایگاه داده ممکن نخواهد بود.
  • امیرمسعود ایرانی

تهیه پشتیبان از فایل‌های پروژه با استفاده از 7Zip و MySQLDump

امیرمسعود ایرانی | چهارشنبه, ۱۲ فروردين ۱۳۹۴، ۰۲:۰۲ ق.ظ | ۰ نظر

اگر چه تهیه‌ی پشتیبان با استفاده از فشرده‌سازها حرفه‌ای و ایمن نیست، با این حال ممکن است در برخی موارد، گزینه‌ای مناسب و آسان باشد.

در چنین مواقعی، انجام تنظیمات و کلیک‌های پی‌در‌پی برای رسیدن به نتیجه، کاری زمان‌بر است.

برای افزایش سرعت و دقت، می‌توان از Batch File برای مکانیزه کردن فرآیند فشرده‌سازی فایل‌ها و پایگاه داده استفاده کرد.

در ادامه یک نمونه اسکریپت که از بانک اطلاعاتی و فایل‌های یک پروژه لاراول پشتیبان تهیه می‌کند را مشاهده می‌کنید:

@echo off
SET PATH=C:\wamp\bin\mysql\mysql5.6.12\bin\;C:\Program Files\7-Zip\
mysqldump.exe --skip-comments -u root azmoon > azmoon\db.sql
del "F:\Project\azmoon\www.7z"
7z a -x!azmoon\laravel\vendor -mx=9 "F:\Project\azmoon\www.7z" azmoon
pause
برای استفاده از اسکریپت بالا می‌بایست کدهای آن را در یک فایل bat در شاخه‌ی بالایی پروژه ذخیره کنید و پس از انجام تغییرات لازم در مسیرهای مشخص شده، آن را اجرا تا یک کپی از فایل‌های پروژه و بانک اطلاعاتی را در یک فایل فشرده در اختیار داشته باشید.

در ادامه به اختصار کارهای انجام شده را توضیح می‌دهم:
دستور echo off سبب می‌شود، دستورات اجرا شده در محیط خط فرمان چاپ نشوند و تنها خروجی به نمایش در آید.
دستور set path مسیرهای مقابل خود را در فهرست شاخه‌های عمومی درج می‌کند تا چنانچه بخواهیم یکی از فایل‌های موجود در این شاخه‌ها را اجرا کنیم، نیاز به تایپ مسیر کامل آن‌ها نباشد.
دستور mysqldump برای تهیه‌ی پشتیبان از یک پایگاه داده استفاده می‌شود. در این دستور از پایگاه داده‌ی azmoon با نام db.sql پشتیبان تهیه می‌کنیم.
دستور del برای حذف آخرین پشتیبان تهیه شده که در مسیر مقابل آن مشخص است به کار می‌رود.
دستور 7z نگارش خط فرمان نرم‌افزار 7Zip است که برای فشرده‌سازی مورد استفاده قرار گرفته است. در این دستور، ابتدا شاخه‌ی vendor را که حاوی کتابخانه‌های دانلود شده از اینترنت است و حاوی تعداد زیادی فایل است از نسخه‌ی پشتیبان استثنا می‌کنیم. سپس قدرت فشرده‌سازی را به حداکثر ممکن می‌رسانیم. و در پایان مسیر فایل پشتیبان که باید ساخته شود و شاخه‌ی فایل‌های پروژه را تعیین می‌کنیم.

با اجرا این دستور، پروژه و اسکریپت پایگاه داده در زمانی بسیار کوتاه به یک فایل فشرده تبدیل می‌شود.

در پایان یک بار دیگر یادآوری می‌شود که این روش برای نگهداری پشتیبان مناسب و ایمن نیست و فقط در موارد خاص یا در کنار روش‌های دیگر مانند استفاده از نرم‌افزارهای کنترل نسخه می‌تواند مورد استفاده قرار گیرد.
  • امیرمسعود ایرانی

تفاوت utf8_unicode_ci و utf8_general_ci و utf8_persian_ci در MySQL

امیرمسعود ایرانی | دوشنبه, ۷ بهمن ۱۳۹۲، ۱۲:۲۳ ق.ظ | ۴ نظر

در هنگام ایجاد پایگاه داده، جدول‌ها و ستون‌های رشته‌ای در MySQL امکان تغییر دادن Collation پیش‌فرض وجود دارد

برای ذخیره‌سازی نوشته‌های یونیکد و از آن جمله فارسی، لازم است تا یکی از زیرمجموعه‌های utf8 انتخاب شود

تفاوت سه گزینه‌ی utf8_unicode_ci و utf8_general_ci و utf8_persian_ci در الگوریتم مرتب‌سازی آن‌هاست که می‌تواند اندکی در عملکرد و کارایی اثرگذار باشد


اگر می‌خواهید متن‌های فارسی را در فیلد خود ذخیره کنید، بهترین گزینه، utf8_persian_ci است که با بیشترین سرعت ممکن و بهترین دقت متن‌های فارسی را به درستی مرتب می‌کند

اگر فیلد شما حاوی متن‌های چندزبانه باشد انتخاب یکی از گزینه‌های utf8_general_ci و utf8_unicode_ci شما را به هدف می‌رساند

utf8_general_ci تفاوت اندکی با utf8_unicode_ci دارد و آن این است که بخشی از الگوریتم‌های یونیکد در آن پیاده نشده است و ممکن است در هنگام مرتب‌سازی برخی زبان‌ها اشتباهاتی در آن مشاهده شود. در عوض کارایی آن بهتر است


با توجه به افزایش قدرت پردازنده‌های امروزی، افزایش کارایی اندکی که با استفاده از utf8_general_ci به دست می‌آید قابل چشم‌پوشی است و بهتر است همیشه از utf8_unicode_ci استفاده کنید


منبع

  • امیرمسعود ایرانی