وبلاگ فيکسل برای گرافيست ها
SharpLife وبلاگ شخصی مهدی تقی زاده
بازگشت شاهو طوفانی
اين صداگذاری و ميکس آخرشه!
نکته جالبی در مورد تابع output_add_rewrite_var
کاراکتر های فارسی در عکس توسط PHP
مصاحبه من با مجله وزین IranAMP
واژه های فناوری اطلاعات و برابر های پیشنهادی فرهنگستان
دوره های آموزش IT
استانداردهای کدنويسی PHP
| صفحه قبل


IranPHP
نماينده رسمي سايت PHP.net

webilix
منبعي براي برنامه نويسان PHP

phprun
وبلاگي خواندني براي تمام PHP كارها

ם تعداد بازديدكنندگان
كل: 924724
ديروز: 915
امروز: 774
ם تعداد كاربران آنلاين
8 نفر
ם پنج مراجعه آخر
znas5eea.strefa.pl
znas5eea.strefa.pl
liyxdrzko.is.com
djdgjkfbf.chez.com
sobesednikjm.hannnari.com
 
 
موتور ذخيره سازی InnoDB
InnoDB ايرادی که مديران بانک اطلاعاتی نسبت به MySQL می گيرند از اين حقيقت سرچشمه می گيرد که موتورهای ذخيره سازی ISAM و MyISAM از تراکنش(Transaction) و کليدهای خارجی(Foreign Keys) پشتيبانی نمی کنند. موتورهای ذخیره سازی InnoDB و BDB علی رغم اينکه سرعت بسيار پايين تری نسبت به ISAM و MyISAM دارند، اما از تراکنش و کليدهای خارجی پشتيبانی می کنند. به همين دليل اگر در طراحی بانک خود به يک يا هر دوی اين امکانات نياز داشتيد و نمی خواهيد به خود دردسر دهید و از راه های آلترناتيو به نتيجه مشابه برسيد، موتور ذخيره سازی InnoDB یا BDB راه چاره شماست.
موتورهای ذخيره سازی InnoDB و (Berkeley DB(BDB حاصل مستقيم فن آوری است که MySQL را چنين انعطاف پذير ساخته است، يعنی MySQL++ API.
اگر به خود اعتماد به نفس دارید و این توانایی را در خود می بینید، می توانید با استفاده از ++MySQL، موتور ذخيره سازی خاص خود را بسازید! اين API تمام توابع موردنياز برای کار با فيلدها، رکوردها، جداول، بانک های اطلاعاتی، حسابهای امنيتی و توابع بسيار ديگری که با کمک آنها می توان یک سيستم مديريت بانک اطلاعاتی نظير MySQL را ايجاد کرد، در اختيار شما قرار می دهد. اگر بخواهيم خيلی روی API متمرکز شويم، از حوصله اين مقاله خارج است و هم اینکه بنده اطلاعات کافی در اين باره ندارم! grin اما مهم اينست که بدانيد APIای نظير ++MySQL وجود دارد که فن آوری موتورهای ذخيره سازی MySQL است.
جداول InnoDB:
موتور ذخیره سازی InnoDB مهمترين آلترناتيوی است که می توان به جای MyISAM به کار گرفت. استفاده از چنين نوع جدولی(Table Type) مزايا و معايب خاص خود را دارد که در ذيل به برخی پرداخته شده است:
مزايا نسبت به MyISAM جداول InnoDB از تراکنش پشتيبانی می کنند بدين صورت جامعيت عمليات بانکی چندمرحله ای را تضمين می کند. در ضمن در اين جداول توابعی پيش بينی شده تا جامعيت ارجاعی(Referential Integrity) هم حفظ شود.
معایب نسبت به MyISAM تمام جداول InnoDB در يک فايل باينری ذخيره می شوند؛ که می توان آنرا يک جعبه سياه در نظر گرفت. برای انتقال يک جدول يا بانک اطلاعاتی از يک Server به Server ديگر، بايد از ابزاری نظير mysqldump استفاده کرد. (در جداول MyISAM، می توان به راحتی فایل ها را کپی و منتقل کرد) از اين گذشته، جداول از اين نوع هنوز از شاخص های تمام متنی(Full-Text Index) پشتيبانی نمی کنند و فضای ذخيره سازی مورد نياز اين جداول در مقايسه با جداول MyISAM بيشتر است.(حدود ۳ برابر) کلا، عملياتهای بانکی ابتدايی در جداول InnoDB نسبت به جداول MyISAM کندتر صورت می پذيرد.
بطور کلی، بسياری از عملکردهای InnoDB مشابه جدوال اوراکل است. اين نوع جداول چندين سال است که توسعه يافته اند و در بسياری از سيستم های بانک اطلاعاتی به کار رفته اند.
موتور ذخيره سازی InnoDB معماری کاملا متفاوتی دارد. InnoDB از مفهمومی به نام Tablespace که تمام ساختار، داده های جدول و شاخصها در آن ذخيره می شود، بهره می برد.
جداول InnoDB دارای خاصيت ACID هستند و قفل گذاری در این جداول در سطح رکورد يا سطر صورت می پذيرد و قيود کليدهای خارجی کاملا قابل پياده سازی است. در جداول InnoDB، بسته به سطح ايزولاسيون(Isolation Level)، برای انجام عمليات SELECT نيازی به قفل گذاری نيست ولی برای بروزرسانی، قفل گذاری در سطح سطر صورت می گيرد.
برای اطلاع از اینکه آیا سرویس دهنده MySQL شما از جداول InnoDB پشتیبانی می کند یا نه، کوئری زیر را صادر کنید.

SHOW VARIABLES LIKE 'have_innodb'

پاسخ های پرس و جوی بالا به قرار ذيل است:
YES- جداول InnoDB فعال است و دست کم دارای پيکربندی ابتدايی است.
NO- جداول InnoDB کامپایل نشده اند.
DISABLED- جداول InnoDB کامپايل شده است اما توسط گزينه skip-innodb-- غيرفعال شده اند.
جداول BDB:
جداول BDB نيز از تراکنش پشتيبانی می کنند. در واقع نوع جدول BDB بود که برای اولين بار تراکنش را در MySQL امکان پذير کرد. یکپارچگی این نوع جدول با MySQL به خوبی InnoDB نيست و در نقاطی از مستندات آن، نکته های مبهمی وجود دارد. بنا به اين دلايل، درايور جدول BDB، با نسخه استاندارد سرويس دهنده MySQL يکپارچه نيست. همواره توصيه می شود که بجای BDB از نوع جدول InnoDB استفاده شود.

من به شخصه سرعت و حجم نوع جدول MyISAM را فدای InnoDB نمی کنم، اگر نياز به تراکنش نداشته باشم و صرفا بخواهم جامعيت ارجاعی را حفظ کنم، اگر تنها DELETE از جدول والد، جامعيت ارجاعی را به خطر بياندازد، نوع جدول را MyISAM انتخاب کرده و با ادغام(Join) دو يا چند جدول در دستور DELETE خيلی سريع و بهينه به هدف خود می رسم. برای مثال با یک کوئری ساده می توانم در آن واحد رکوردهایی را از جدول مرجع و جداول تابعه با بیان فیلد مشترک آنها، حذف کرد. برای اطلاعات بيشتر می توانيد به راهنمای MySQL مراجعه کنيد.
البته این راه چاره، اهمیت قابلیت جامعیت ارجاعی را کمرنگ نمی کند، سایر امکاناتی که با وجود جامعیت ارجاعی در دسترس ما قرار می گیرد، قابل گذشت نیست. اما در مواردی بسته به نیاز و طراحی خاص، راه های جایگزین بهینه تری نظیر موردی که ذکر شد، وجود دارد.

 
نظرات شما(79)  
تابع ()RAND
RAND() question فرض کنید مجموعه ای از مقادير را در اختيار داريم و می خواهيم از ميان اين مقادير، يک يا چند فقره به صورت تصادفی انتخاب کنيم. تا اينجا صورت کلی مساله رو داشته باشيد. مسلما راه حلها و روشهای زيادی به ذهتون خطور می کنه. اما من صورت مساله را کمی اختصاصی تر تعریف می کنم. می خواهم از ميان چندين رکورد موجود در يک جدول بانک اطلاعاتی، يک يا چندين رکورد را به تصادف انتخاب کنم و نمی خواهم که تمام رکوردها را به حافظه منتقل کرده و از بين آنها و با کمک توابع زبان اسکريپتی به هدف خود برسم. ميخواهم اين کار را با خود MySQL انجام دهم یعنی در سمت خود بانک اطلاعاتی؛ چاره چيست؟!
MySQL تابعی دارد به نام ()RAND که وقتی فراخوانده شود، عددی تصادفی بين ۰ تا ۱ را توليد می کند. امتحان کنيد:

mysql> SELECT RAND(), RAND(), RAND();

اگر اين تابع را با يک آرگومان عدد صحيح فراخوانی کنيم، ()RAND از اين مقدار جهت Seed کردن مولد عدد تصادفی بهره می برد. هرگاه شما مولد را با مقدار معینی Seed کنيد، تابع ()RAND رشته ای تکراری از اعداد توليد می کند.

mysql> SELECT RAND(1);
mysql> SELECT RAND(20000000);
mysql> SELECT RAND(1);
mysql> SELECT RAND(20000000);

اگر بخواهيد اين تابع را با مقادير تصادفی Seed کنيد، مقدار Seed، می بايست از منبعی بی نظم باشد. چنين منبعی می تواند Timestamp فعلی يا شناسه اتصال(Connection Identifier) باشد که به تنهايی يا تواما مورد استفاده قرار می گيرند. پس خواهيم داشت:

mysql> SELECT RAND(UNIX_TIMESTAMP()) AS rand1,
-> RAND(CONNECTION_ID()) AS rand2,
-> RAND(UNIX_TIMESTAMP()+CONNECTION_ID())
-> AS rand3;

حال که با اساس کار اين تابع آشنا شديم، دوباره به صورت مساله نگاهی مياندازيم؛
از اين تابع می توان برای تصادفی کردن ترتيب سطرها استفاده کرد. ميشه گفت که اين آرايش تصادفی سطرها با افزودن عبارت ORDER BY حاصل می شود. اينکه مکانيزم و نحوه کار دقيقا به چه صورت هست از حوصله اين مقاله خارج است(بر عهده شما) اما به اختصار، توضيحی در اين باره می دهم. وقتی شما از ()ORDER BY RAND استفاده می کنيد، MySQL مجموعه از اعداد تصادفی را به مجموعه نتايج شما نسبت می دهد و نتايج را برحسب اين اعداد تصادفی، مرتب می کند.
با اين تفاسير، اگر بخواهيم از ميان چندين رکورد، يک رکورد را انتخاب کنيم، ابتدا از عبارتی که ذکر شد، استفاده می کنيم و سپس در انتهای کوئری با نوشتن LIMIT1 مشخص می کنيم که تنها يک فقره مورد نياز است.(اولین رکورد بعد از مرتب سازی تصادفی رکوردها) برای مثال برای شبيه سازی پرتاب يک تاس، می توان يک جدول با نام die ايجاد کرد که دارای سطرهايی با مقادير صحيح ۱ تا ۶ است. سپس با استفاده از دستور زير تاس را پرتاب می کنيم!

mysql> SELECT n FROM die ORDER BY RAND() 
-> LIMIT 1;

همانطور که می بينيد، انتخاب با جايگزينی صورت می پذيرد (تو ریاضی چی بهش میگن؟! smile) يعنی وقتی مهره ای از کيسه بيرون می آوريم، دوباره آن را داخل کيسه می گذاريم. پس می توان دوباره آن را انتخاب کرد. بنابراين در گزينش های بعدی احتمال اين وجود دارد که همان مهره را انتخاب کنيم. از ديگر نمونه هايی که در آنها انتخاب با جايگزينی وجود دارد:
** انتخاب يک آگهی تبليغاتی(Banner Ad) به منظور نمايش در يک صفحه وب(سیستم تبلیغات چرخشی سایت TopWeblogs.com را با همین روش درست کرده بودم)
** انتخاب يک نقل قول از بزرگان و نمايش آن(بالای وبلاگ محسن را نگاه کنید)
** انتخاب يک تصوير از گالری عکس و نمايش آن
** و ساير کاربردهايی از اين دست
نمونه ای از انتخاب بدون جایگزینی:
** قرعه کشی و انتخاب یک کاربر خوش شانش!
اگر بخواهيم، بيش از يک فقره انتخاب کنيم چه؟ کافيست آرگومان LIMIT را به عدد دلخواه تغيير دهيم. مثلا LIMIT 5
روش ديگر وقتی است که بدانيم ستونی از جدولمان دارای مقادير پشت سر هم و مسلسلی از ۱ تا n است. در چنين شرايطی، بجای اينکه عمليات مرتب سازی را روی کل جدول انجام دهيم، ابتدا یک مقدار تصادفی انتخاب کرده(البته در همان گستره ۱ تا n) و سپس سطر متناظر با آن مقدار را انتخاب می کنيم.( این روش در صورتی که این ستون دارای شاخص باشد و تعداد رکوردهای(سطرها) جدول زیاد باشد، بسیار سریعتر از ORDER BY RAND() LIMIT 1 عمل می کند.)

mysql> SET @id = FLOOR(RAND()*n)+1;
mysql> SELECT ... FROM tbl_name WHERE id = @id;

* بعلاوه ۱ در سطر اول پرس و جوی بالا، برای اينست که متغير داخلی id@ برابر صفر نشود.
* پرس و جوهای(Query) فوق را می توانيد مستقيما در ترمينال مبتنی بر فرمان MySQL وارد کنيد. برای اين کار در ويندوز با تایپ cmd در پنجره Run، وارد محيط داس شويد و از دايرکتوری bin واقع در ريشه دايرکتوری MySQL فرمان زير را اجرا کنيد:
(اگر کاربر root دارای رمزعبور باشد به آخر دستور زير پارامتر p- را اضافه می کنيد.)

D:\mysql\bin>mysql -u root

* تا حال حتما به فوايد اين روش پی برده ايد، خيلی ها هنوز کل مجموعه نتايج را خوانده و در يک آرايه می ريزند و از بين کليدهای آن آرايه، مقداری را به تصادف انتخاب می کنند.(آخر Overhead)
Terminology من درآوردی: به روش بالا الگوی طراحی(Design Pattern) پت و مت گفته می شود!! lol
 
نظرات شما(3)  
PHP 5.0.0 منتشر شد.
PHP 5.0.0 خانم ها و آقایون ضمن عرض پوزش، برنامه رو قطع می کنم تا خبری که هم اکنون به دستم رسید را براتون قرائت کنم. تحولی صورت گرفته بس خفن! بیشتر از این شما رو معطل نمی گذارم و اعلامیه رو قرائت می کنم:
سرانجام انتظارها به پايان رسيد؛ شيخ ما از مريدی به مرشدی رسيد.
بالاخره بعد از سه دوره انتشار آزمايشی و رفع باگها، نسخه نهايی PHP 5 عرضه شد.
برخی ویژگی های این نسخه:

موتور Zend نسخه ۲ به همراه مدل شی(Object Model) جدید و برخی امکانات تازه. موتور Zend به عنوان مفسر از نسخه سوم، پشتوانه PHP هست.
پشتیبانی از XML کلا متحول شده و تمام اکستنشنها بر پایه کتابخانه libxml2 متمرکز شده اند. این کتابخانه به عنوان بهترین روش کار با داده های ساختارمند نظیر XML شناخته شده است.
با بکارگیری اکستنشن SimpleXML دسترسی و دستکاری فایلهای XML به راحتی صورت می پذیرد.
اکستنشن جدید SOAP بصورت توکار لحاظ شده که کار با Web Service ها را به مراتب ساده می کنه.
اکستنشن جدید MySQL با نام MySQLi برای توسعه دهندگانی که با نسخه ۴.۱ و بالاتر این بانک اطلاعاتی رابطه ای قدرتمند، پایدار و سریع کار می کنند. تو این اکستنشن هم واسط شی گرایی وجود داره و هم واسط قدیمی و علاوه بر اینها در این اکستنشن تمهیداتی جهت استفاده از امکانات جدید MySQL نظیر Prepared Statement ها اندیشیده شده است.
این Prepared Statementها با Stored Procedureها اشتباه نگیرید، اولی در سمت Application پیاده سازی میشه ولی دومی در سمت سرویس دهنده بانک اطلاعاتی.
SQLite یک بانک اطلاعاتی ریزه و میزه ولی در عین حال قدرتمند و مبتنی بر فایل هست که واسط SQL داره، خوراک اپلیکیشنهای در مقیاس کوچک مثل همین وبلاگ هست و خوبی اش اینه که دیگه نیاز به یک RDBMS تمام عیار نیست و حتی روی پلات فرم ویندوز، صرفا با نصب PHP هم می توان همچین سایتی رو راه اندازی کرد. SQLite با PHP به صورت Bundle هست.(تو بغچه اشه!)
و...

برای آگاهی از آخرین تغییرات از نسخه RC3 به بعد اينجا نگاهی بياندازيد.
پی نوشت ۱:
البته زياد دل اتون رو خوش نکنيد که هوستينگهای لينوکس، درجا اقدام به بروز رسانی و ارتقا بکنند. يادمه PHP 4 که عرضه شده بود تا نسخه ۴.۰.۶ که پنج تا شش ماه از انتشار رسمی نسخه ۴ گذشته بود، هوستينگها تمايلی به ارتقا نداشتند. ولی فکر کنم اين دفعه اين زمان کمتر باشه يعنی در ۴ ماه آينده، هوستينگها روی اين نسخه سوئيچ بکنند.
پی نوشت ۲:
برنامه Zend Studio ویرایش ۳.۵ رو گرفتم هم نسخه Client و هم Server. خيلی امکانات خوبی بهش اضافه شده(قبلا در موردش نوشته بودم یه سرچ بزنید پیدا می کنید. این سرچ بغل برای عمه ام نیست بخدا!) و مهم تر اينکه کاملا با سينتکس PHP 5 همگامه و مهم تر تر اين که سرعتش نسبت به نسخه سوم خيلی بالاتر رفته و ديگه کار کردن باهاش مثل قبلا عذاب آور نيست البته به شرطی که در Task Managerاتون فقط Zend Studio يکه تاز باشه! wink
یک تشبیه:
توسعه دهنده وب PHP کار بدون Zend Studio = فرد(Fred) در کارتون عصر حجر
توسعه دهنده وب PHP کار با Zend Studio = خالق(Creator) در مترکیس ریلودد!
يک توصيه دوستانه:
بيلی جون بدو بدو تا سهم ات تو بازار نيومده پايين نسخه ۲ دات نت رو بده که اوضاع بدجور خيطه داداش! cool
ويرايش شده در چهارشنبه، 24 تير 1383 ساعت 18:55
 
نظرات شما(15)  
| صفحه قبل
 
 
نام: نيما شايافر
متولد: 7/7/1362
تحصيلات: دانشجو
شغل: طراح وب و برنامه نويس
وضعيت: آفلاين

ماهيانه
مرداد 86 (2)
خرداد 86 (1)
دي 84 (4)
آذر 84 (5)
مرداد 84 (1)
تير 84 (1)
ارديبهشت 84 (2)
دي 83 (1)
آذر 83 (2)
آبان 83 (2)
مهر 83 (4)
شهريور 83 (6)
مرداد 83 (3)
تير 83 (7)
خرداد 83 (7)
ارديبهشت 83 (8)
فروردين 83 (13)
اسفند 82 (12)

موضوعي






جستجوي پيشرفته

BlogRolling is currently inaccessible.
©2004, Design & Developed by: Nima Shayafar. All rights reserved.