/
  • استفاده بهینه و حرفه ای از MySQL

  • ارسال پاسخ   امتیاز موضوع:
    • 1 رأی - میانگین امیتازات: 5
    • 1
    • 2
    • 3
    • 4
    • 5

    حالت موضوعی | حالت خطی استفاده بهینه و حرفه ای از MySQL
    نویسنده پیام
    k2-4u آفلاین
    LAMP Programmer
    ***

    ارسال‌ها: 88
    تاریخ عضویت: ۱۳۸۸ مرداد ۲۱
    اعتبار: 4
    تشکرها : 64
    ( 218 تشکر در 56 ارسال )
    ارسال: #1
    استفاده بهینه و حرفه ای از MySQL
    سلام دوستان این تاپیک رو برای روش های خوب برای ارتباط بین php و mysql
    زدم . برای مثال ما همیشه دستورات کوچک SQL و بلند PHP داریم که این درست نیست
    خیلی موافق میشه به وسیله دستورات SQL خیلی کار ها رو انجام داد


    چرا دستورات SQL را بیشتر کنیم ؟

    خب دوستان برای فرض کنید که شما می خواین یک لیست HTML درست کنید که اطلاعاتش از دیتابیس دریافت میشه
    حالا شما . چند مرحله کار رو برای ساخت این لیست انجام میدین

    1. یک Query ساده SELECT و یک شرط WHERE رو ارسال می کنید

    2. در مرحله دوم اطلاعات رو به وسیله توابعی مانند Mysql_fetch_assoc در یک حلقه دریافت می کنید

    -----------------> در پشت صحنه . اطلاعات از هسته Mysql به صورت نشانه گذاری شده به php ارسال میشه و بعد
    طی چندین مرحله این اطلاعات از هم جدا سازی می شوند (Split) که این برای خودش بردازشی داره

    3. اطلاعات بعد از Split شدن در یک حلقه . دریافت میشن و بعد با چندین اپراتور اتصال و ... به کد های HTML
    متصل می شوند و در آخر در خروجی ظاهر می شوند --

    اگر با دقت برسی کنید
    اطلاعات یک بار در هسته Mysql نشانه گذاری می شوند
    سپس در تابع Mysql_fetch_assoc . از هم جدا میشوند و دوباره
    به وسیله HTML به هم متصل می شوند !؟
    خب ؟
    یک راه کم هزینه تر هم وجود داره !
    اونم اینه که اطلاعات رو به وسیله کد های HTML در همون سمت MySQL نشانه گذاری کنید
    و بصورت یکپارچه دریافت کنید

    به مثال زیر دقت کنید


    در حالت معمولی یک لیست به صورت زیر است
    کد PHP:
    $query=mysql_query('SELECT * FROM TableName WHERE(id='.$id.');');

    $a='<table border="1">';
    while(
    $row=mysql_fetch_assoc($query)){
        
    $a.='<tr><td>'.$row['name'].'</td>'.
        
    '<td>'.$row['email'].'</td></tr>';
    }
    $a.='</table>';

    echo 
    $a
    و حالا در روش بهینه به این صورت
    کد PHP:
    $query=mysql_query('SELECT GROUP_CONCAT("<tr><td>",name,"</td><td>",email,"</td></tr>" SEPARATOR "") FROM TableName WHERE(id='.$id.');');

    $out=mysql_result($query,0);

    echo 
    '<table border="1">'.$out.'</table>'
    و البته این مثال بود نکات و ... مسایل زیادی هست که در ادامه در موردش صحبت میشه
    قسمت اول : تعریف دیتابیس و اتصال به آن

    خب دوستان در این قسمت در مورد چگونگی ساخت دیتابیس و اتصال به آن صحبت می کنیم

    اگر از زبان فارسی استفاده می کنید باید دیتابیس رو Unicode کنید
    که درست انجام دادن این کار خیلی مهم است

    در مرحله ساخت دیتابیس (برای فارسی ) Unicode رو بر روی utf8_persian_ci و Charset رو
    روی utf8 تنظیم کنید . نکته بسیار مهم طریقه اتصال به دیتابیس Unicode شده و ریختن اطلاعات در
    دیتابیس هست


    در بسیار از مواقع دیتابیس درست Unicode میشه
    ولی اطلاعات درست INSERT نمیشن . برای فهمیدن این مشکل کافی از . سطر های دیتابیس رو با
    phpmyadmin نگاه کنید . در صورتی که نوشته های فارسی قابل خواندن نباشند یعنی شما درست از Unicode
    استفاده نکردین . توجه داشته باشید که همین اطلاعات در هنگام واکشی کردن در یک صفحه PHP درست نشان داده میشوند


    مراحل کار به صورت زیر است

    1. دیتابیس را با یونیکد utf8_persian_ci بسازید
    کد PHP:
    CREATE DATABASE  `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_persian_ci

    2. بعد از اتصال به دیتابیس
    نوع Unicode رو با یک Query مشخص کنید
    کد PHP:
    $link mysql_connect('localhost',$user,$pass);

    mysql_select_db($link,'mydb');

    mysql_query('SET CHARACTER SET utf8;'); 

    سپس بعد از INSERT چندین مقدار در دیتابیس
    به وسیله phpmyadmin سطر ها را نگاه کنید
    متوجه می شوید که تمامی جملات فارسی سطر ها قابل خواندن است
    اگر به صورت تحقیق حجم دیتابیس را در 2 حالت اتصال اندازه گیری کنید متوجه
    تفاوت آن خواهید شد .

    و نکته مهم این است که اگر اتصال را درست انجام ندهید در هنگام استفاده از توابعی مانند CONCAT
    دچار مشکل خواهید شد
    (آخرین ویرایش در این ارسال: ۱۳۸۸ بهمن ۲۱ ۰۸:۰۶ عصر، توسط k2-4u.)
    ۱۳۸۸ بهمن ۱۵ ۰۶:۰۶ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : admin amir.s zoghal parvane php HiddeN mahyar1365 nasserghiasi mehdi.gpr ahora
    admin آفلاین
    وحید سهرابلو
    **********

    ارسال‌ها: 5,697
    تاریخ عضویت: ۱۳۸۷ آذر ۲۴
    اعتبار: 100
    تشکرها : 1362
    ( 6197 تشکر در 3438 ارسال )
    ارسال: #2
    RE: استفاده بهینه و حرفه ای از MySQL
    ممنون از مطالب مفیدت.
    البته در مورد اون مثال که html رو‌ بردی داخل دستور sql مخالفم.‌ شاید نتیجه خروجی یکی باشه اما روند کار هر دوتاش نمیشه گفت یکی هست. در ضمن اینجوری دست برنامه نویس رو توی قرار دادن اطلاعات و بازی کردن با اطلاعات می بندیم. نظر من اینه تا جایی که میشه رفتارها رو از داخل sql بیاریم‌ بیرون. دیتابیس نقطه حساسی هست و یک اشتباه کوچیک یا یه چیز اضافه ای می تونه سرعتش و بهینگیش رو کاهش بده.
    مورد بعدی در UNSIGNED هست که در صورت استفاده طول ‌مثلا در TINYINT ‌رنج از -128 تا +127 (‌تا جایی که من می دونم تا ۱۲۷ هست و عدد ۱۲۸ رو پشتیبانی نمی کنه چون overflow میشه -‌ چون ۸ بیتی هست و یه بیت میره واسه علامت میشه ۷ بیت. ۷ بیت هم میشه ۰ تا ۱۲۷ واسه بقیه اعداد هم یکی باید از مقدار مثبت کم کنی همیشه تا عدد فرد میره) به ۰ تا ۲۵۵ رنجش میره
    ۱۳۸۸ بهمن ۱۵ ۰۶:۴۵ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : ahora
    k2-4u آفلاین
    LAMP Programmer
    ***

    ارسال‌ها: 88
    تاریخ عضویت: ۱۳۸۸ مرداد ۲۱
    اعتبار: 4
    تشکرها : 64
    ( 218 تشکر در 56 ارسال )
    ارسال: #3
    RE: استفاده بهینه و حرفه ای از MySQL
    نقل قول: البته در مورد اون مثال که html رو‌ بردی داخل دستور sql مخالفم.‌ شاید نتیجه خروجی یکی باشه اما روند کار هر دوتاش نمیشه گفت یکی هست. در ضمن اینجوری دست برنامه نویس رو توی قرار دادن اطلاعات و بازی کردن با اطلاعات می بندیم. نظر من اینه تا جایی که میشه رفتارها رو از داخل sql بیاریم‌ بیرون. دیتابیس نقطه حساسی هست و یک اشتباه کوچیک یا یه چیز اضافه ای می تونه سرعتش و بهینگیش رو کاهش بده.
    خب بستگی داره کجا استفاده بشه.
    میشه فهمید که چه تاثیری داره . یعنی مثبته یا منفی .
    اگر به توضیحات قبل از مثال دقت کنید متوجه میشین که چرا این توصیه رو کردم
    در ضمن من BENCHMARK کردم . و متوجه شدم هم از نظر زمان هم حافظه بهتره
    و البته نظر خودم اینه که این روش برای کوئری های کوتاه استفاده بشه

    در رابطه با 128
    منبع خود سایت MySQL بود
    http://dev.mysql.com/doc/refman/5.1/en/n...types.html
    ۱۳۸۸ بهمن ۱۵ ۱۱:۵۰ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : ahora
    admin آفلاین
    وحید سهرابلو
    **********

    ارسال‌ها: 5,697
    تاریخ عضویت: ۱۳۸۷ آذر ۲۴
    اعتبار: 100
    تشکرها : 1362
    ( 6197 تشکر در 3438 ارسال )
    ارسال: #4
    RE: استفاده بهینه و حرفه ای از MySQL
    به هر حال من نظرم این هست که بار روی دیتابیس نباشه. دیتابیس خودش مشغله بیشتری رو داره
    در مورد 128 ‌ هم با توجه به منبع باز حرف من درست هست منبع گفته برای علامت دار از -۱۲۸ تا ۱۲۷ و برای بدون علامت از ۰ تا ۲۵۵ که قانونش هم با فلسفش هم همون بیت های بود که گفتم
    ۱۳۸۸ بهمن ۱۶ ۰۱:۰۹ صبح
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : ahora php
    k2-4u آفلاین
    LAMP Programmer
    ***

    ارسال‌ها: 88
    تاریخ عضویت: ۱۳۸۸ مرداد ۲۱
    اعتبار: 4
    تشکرها : 64
    ( 218 تشکر در 56 ارسال )
    ارسال: #5
    RE: استفاده بهینه و حرفه ای از MySQL
    نقل قول: در مورد 128 ‌ هم با توجه به منبع باز حرف من درست هست منبع گفته برای علامت دار از -۱۲۸ تا ۱۲۷ و برای بدون علامت از ۰ تا ۲۵۵ که قانونش هم با فلسفش هم همون بیت های بود که گفتم
    بله ! درسته دقت نکرده بودم
    ۱۳۸۸ بهمن ۱۶ ۰۱:۱۱ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : ahora
    k2-4u آفلاین
    LAMP Programmer
    ***

    ارسال‌ها: 88
    تاریخ عضویت: ۱۳۸۸ مرداد ۲۱
    اعتبار: 4
    تشکرها : 64
    ( 218 تشکر در 56 ارسال )
    ارسال: #6
    ساخت Select Box
    خب دوستان یکی از چیز های که در وبسایت های خیلی استفاده میشه
    همین select box ها هستند که .خیلی وقت ها از دیتابیس خونده میشن . حالا
    یک راه خیلی خوب برای ساخت select box

    کد PHP:
    $query mysql_query(<<<'EOT'
        SELECT GROUP_CONCAT('\r\n<option ',IF(id=9,'selected="selected"',''),' value="' , id , '">' , name , '</option>'  SEPARATOR '')
        as aa FROM `stu3631_class`
    EOT
    );

    $result mysql_result($query,0);

    echo 
    '<select name="name">' $result"\r\n</select>"

    توضیح :

    برای گذاشتن کد های SQL در تابع mysql_query از دستور EOT استفاده شده که دیگه نیازی به Scape کردن
    کارکتر های مثل ' نباشه . در هنگام استفاده از EOT نکات زیر رو رعایت کنید

    1. بعد از شروع EOT بدون هیچ کارکتری یک خط بروید .
    2. در پایان قبل از EOT هیچ کارکتری نگذارید و اونو در خط جدید قرار بدین

    -----------------------
    تابع GROUP_CONCAT . برای متصل کردن همه سطر های دریافت شده . به هم
    قابل استفاده است . این تابع می تواند به مقدار نامحدود ورودی بگیرد
    شما می توانید نام ستون ها یا مقادیر رشته ای را به ورودی این تابه بدهید
    برای مثال SQL زیر
    کد:
    SELECT GROUP_CONCAT("<p>",name,"<p />" SEPARATOR "<br />") FROM  Tb1;
    باعث تولید کدی مانند

    کد:
    <p>ali</p>
    <br />
    <p>reza</p>
    <br />
    <p>mohsen</p>

    میشود . مقدار جلوی SEPARATOR . کارکتر جدا کننده بین سطر ها را مشخص می کند . برای مثال
    کد:
    SELECT GROUP_CONCAT(name SEPARATOR "|") FROM  Tb1;
    خروجی
    کد:
    ali|reza|amir|korosh
    را می دهد
    ------------------------------
    در کد بالا تکه کد های HTML یک select box
    به صورت جدا گانه به تابع GROUP_CONCAT داده شده است .
    مقدار value هر option این select box برابر سطری با نام id
    و نوشته های option ها براب سطری با نام name است
    مقدار SEPARATOR نیز برابر خالی است . اگر این سویچ را تعریف نکنید . به صورت
    پیشفر کارکتر "کاما" در نظر گرفته میشود
    -------------------------
    تابع IF :

    اگر دقت کرده باشید یکی از ورودی های تابع GROUP_CONCAT در کد بالا تابع IF است
    کد:
    IF(id=9,'selected="selected"','')
    این تابع مانند دستور IF است .
    آرگومان اول : شرط مورد نظر . که می توانید از نام سطر ها و عملگر های منطقی و .. استفاده کنید
    http://dev.mysql.com/doc/refman/5.0/en/n...ators.html

    آرگومان دوم : در صورتی که شرط درست باشد . خروجی داده میشود
    آرگومان سوم : در صورتی که شرط اشتباه باشد . خروجی داده میشود

    در کد بالا نقش این IF مشخص کردن این است که
    کدام یک از عناصر Select box به صورت پیشفرض انتخاب شده باشد .
    که همان طور که میبینید در صورتی که مقدار ستون id برابر 6 باشد همان
    سطر به صورت پیشفرض انتخاب میشود
    ---------------------

    در آخر خروجی تابع Mysql_query به تابع mysql_result فرستاده میشود
    و از آنجا که Query فقط یک جواب دارد . آرگومان آخر تابع mysql_result
    صفر در نظر گرفته شده است .
    خروجی تابع mysql_result بعد از اتصال به
    کد شروع و پایان Select box در خروجی ظاهر می شود
    ------------------

    نکات مهم :

    1 - در صورتی که سطرهای ستون شما . تغییر نمی کنند .
    مانند نام شهر , کشور و ... می توانید Type آن را . ARCHIVE یا myisampack
    بگذارید که در سرعت و حجم بسیار موثر است

    2 - درست یونیکد کردن دیتابیس بسیار مهم است (که قبلا توضیح دادم )

    3 - این روش برای سطر های طولانی توصیه نمی شود
    (آخرین ویرایش در این ارسال: ۱۳۸۸ بهمن ۲۱ ۰۷:۵۹ عصر، توسط k2-4u.)
    ۱۳۸۸ بهمن ۲۱ ۰۷:۵۶ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : admin ahora parvane php
    admin آفلاین
    وحید سهرابلو
    **********

    ارسال‌ها: 5,697
    تاریخ عضویت: ۱۳۸۷ آذر ۲۴
    اعتبار: 100
    تشکرها : 1362
    ( 6197 تشکر در 3438 ارسال )
    ارسال: #7
    RE: استفاده بهینه و حرفه ای از MySQL
    ممنون از مطالب مفیدت.
    البته با اجازه شما یه مطلبی دیگه از GROUP_CONCAT بیرم که در واقع کاربرد اصلی این تابع هست و البته مطلبی که شما هم گفتید درسته
    کد:
    CREATE TABLE services (
    id INT UNSIGNED NOT NULL,
    client_id INT UNSIGNED NOT NULL,
    KEY (id));
    INSERT INTO services
    VALUES (1,1),(1,2),(3,5),(3,6),(3,7);
    SELECT id,client_id FROM services WHERE id = 3;
    +----+-----------+
    | id | client_id
    +----+-----------+
    |  3 |         5
    |  3 |         6
    |  3 |         7
    +----+-----------+
    SELECT id,GROUP_CONCAT(client_id) FROM services WHERE id = 3 GROUP BY id;
    +----+-------------------------+
    | id | GROUP_CONCAT(client_id)
    +----+-------------------------+
    |  3 | 5,6,7                  
    +----+-------------------------+
    ۱۳۸۸ بهمن ۲۱ ۰۸:۱۹ عصر
    یافتن ارسال‌ها پاسخ با نقل قول
     تشکر شده توسط : k2-4u zoghal ahora parvane php
    « قدیمی تر | تازه‌ تر »

    ارسال پاسخ
    پرش به انجمن:


    کاربرانِ درحال بازدید از این موضوع: 1 مهمان
    IranPHP.org | تماس با ما | بازگشت به بالا | بازگشت به محتوا | بایگانی | پیوند سایتی RSS