الدعوة عامة لحضور العرض الأول التجريبي لسوالف كاست
ويكيمانيا 2008. الإسكندرية، من 17 وحتى 19 يوليو

 

العودة   سوالف سوفت > قسم تطوير وبرمجة المواقع للمتقدمين > تطوير الويب
المدوّنات البحث مشاركات اليوم اجعل كافة المشاركات مقروءة

موضوع مغلق
 
LinkBack أدوات الموضوع
عضو نشيط
تاريخ التسجيل: Apr 2003-
#1 (permalink)  
الطريقة المثالية لاجراء استعلام وبحث سريع في MySql


الكثير من البرامج التي تعتمد على MySql تستخدم طرق متعددة لاجراء البحث في قواعد البينات بشكل سريع والحد من درجة الخطورة في الاستعلامات المعقدة
ولقد أجريت دراسة في هذا الموضوع لجميع الطرق والحلول التي تستخدم للبحث في قواعد البينات MySql
وايضا تسريع الاستعلام بواسطة الفهارس
فتفضل بالاطلاع على الموضوع الشيق والجدير بالاهتمام

الفهارس

يعتبر الفهرس index في MySql افضل الخصائص التي تساعد في سرعة الحصول على البينات المطلوبة .
يعتبر الفهرس فريد اذا كانت كل قيمة فيه تختلف عن غيرها مثل مفاتيح الجداول PRIMARY KEY يعتبر فهرس فريد وهو اسرع الطرق للاستعلام
اما الفهارس غير الفريدة قابلة لتطبيق بناء على البينات الموجودة بها وهذا النوع من الفهارس نجرية على الحقول التي نجري عليها استعلام البحث بستخدام الكلمة الاساسية like
اذا الفهارس تفيد تسريع الاستعلام بصورة عامة

التطبيق


على أفتراض ان لدينا جدول يحفظ فيه الكثير من النصوص ونريد ان نبحث عن كلمة في الحقل الخاص بنص هنا من الافضل ان يكون الحقل مفهرس وبنسبة لنصوص يتم فهرسة كامل النص
مثال :
جدول المقالات لبرنامجنا يفترض ان يتم انشائة بطريقة التالية


كود:
CREATE TABLE articles (
          id mediumint(9) default NULL auto_increment,
          title varchar(80) NOT NULL default '',
          writer varchar(65) NOT NULL default '',
          text mediumtext NOT NULL,
          date int(11) NOT NULL default '0',
          stat int(1) NOT NULL default '0',
          reader int(10) NOT NULL default '0',
          PRIMARY KEY (id),
          KEY date_reader(date,reader),
          FULLTEXT KEY text(text)
        );
هذا الجدول يحتوي على
الحقل id ويعتبر PRIMARY KEY كما قمنا بتعريفة في السطر رقم 9
وهو المفتاح الرئيسي للجدول ويعتبر فهرس فريد
السطر رقم 10
KEY date_reader(date,reader),
قمنا بانشاء فهرس لحقلين الحقل الاول هو حقل التاريخ والحقل الثاني هو حقل عدد زوار المقال
لماذا تم انشاء فهرس لهذه الحقول
نحتاج في برنامج المقالات ان نعرض المقالات المضافة قبل شهر

فنجري حسابات نستنتج منها التاريخ قبل شهر ونحفظة في متغير
lastmonth بعد ذلك نجري الاستعلام بناء على التاريخ
ويتم الاستعلام بهذا الشكل
كود:
SELECT * FROM articles WHERE date >='$lastmonth'
وبناء على هذا المثال يتم انشاء فهرس لكل حقل نستعين به في الاستعلام بعد الشرط WHERE

كم الوقت المتوقع اختزالة من هذه العملية ؟

لو اجري هذا الاستعلام على مليون حقل ربما يستغرق 60 ثانية اذا لم يكن هناك فهارس اما مع وجود فهرس يختزل وقت الاستعلام السابق
ليصبح 0.08 ثانية فقط :SMI:

ولكن ماذا لو استخدمنا البحث بصيغة التشابة like هنا الوقت المستنفذ في البحث كبير وربما يشكل خطورة على قاعدة البينات

لدينا في الجدول articles حقل text هذا الحقل يحفظ فيه كتلة كبيرة من النصوص وفي حالة البحث عن كلمة في الحقل text بستخدام like على افتراض وجود مليون حقل ونتوقع تكرار الكلمة اكثر من الف مرة في هذه الحقول , اتوقع ان هذا البحث قد يدمر القاعدة برمتها .

لذلك نضع جميع الاحتياطات الممكنة لتفادي هذه المشكلة
اولا : نجري فهرس للحقل text كما تلاحظ في الجدول السابق في السطر الاخير FULLTEXT KEY text(text)

ثانيا : يمنع البحث عن الكلمات التي تستخدم بستمرار في النصوص ولا يفترض ان يتم البحث عنها مثل ( حروف الجر , أن واخواتها .... الخ )
ولكي لا نستغرق الوقت في حصر هذه الكلمات نضع حد لعدد احرف كلمة البحث والحد المناسب اكثر من ثلاثة احرف
ومع ان هذا الحد قد يدخل فيه بعض الكلمات المتوقع البحث عنها مثلا على المستوى العربي مثلا ( قطر )
ولكن بنسبة لي افضل التضحية بالكثير من الكلمات حتى احافظ على سرعة البحث والحد من خطر هذا البحث
ثالثا : يمنع البحث عن رموز مثل الاقواس والنجمة * وغيرها من الرموز

الان وقد تم ضبط البحث ولكن تظهر لنا مشكلة لم تكن في الحسبان
وهي عرض النتائج

جدول نتائج البحث


المشكلة لو ان عدد النتائج كبير هل نقوم بعرض جزء منها وفي الصفحة التالية نقوم بعملية البحث من جديد ونعرض جزء غير السابق ؟
هذا غير مجدي مع ان العملية ناجحة ولكن البحث بهذه الطريقة يعتبر اجهاد لقاعدة البينات
لهذا يتم انشاء جدول خاص بنتائج البحث search_results
ولهذا الجدول خصائص اتفق عليها المبرمجين وخصائص تضاف بناء على بنية البرنامج او الجدول الذي نبحث فيه
بنسبة لجدول المقالات السابق
نضع جدول جديد لنتائج البحث search_results

كود:
CREATE TABLE search_results (
  id mediumint(9) default NULL auto_increment,
  articl_id text NOT NULL,
  articl_word varchar(100) default NULL,
  search_date int(11) NOT NULL default '0',
  articl_date int(11) NOT NULL default '0',
  articl_order varchar(4) NOT NULL default 'desc',
  articl_max int(10) NOT NULL default '0',
  user_id mediumint(10) default '0',
  ip varchar(64) default NULL,
  PRIMARY KEY (id)
);
الفائدة من الجدول السابق
1) عرض النتائج على صفحات متعددة وتنسيق العرض
2) حفظ الكلمة التي تم البحث عنها بذلك نستطيع العودة لهذه النتيجة اذا كا تخزين النتائج غير مؤقت في هذا الجدول
3 ) حفظ رقم الايبي لمن قام بالبحث وحفظ الاسم اذا كان احد الاعضاء لمعرفة ما اذا كان القصد من البحث الضرر ويتم ايقاف صاحب رقم الايبي عن البحث ومن الافضل وضع حد معين لرقم الايبي مثلا يحق له استخدام محرك البحث في الساعة خمس مرات ( مجرد اقتراح )

تعال نلقي نظرة على الحقول الخاصة بالجدول السابق
الحقل articl_id يحفظ فيه ارقام المقالات التي يوجد بها كلمة شبية كلمة البحث وتفصل هذه الارقام اما بفاصة , او برمز يستخدمة المبرمج لان هذا الرمز او الفاصلة سوف تفرز النتائج على اساسها
الحقل articl_word نحفظ فيها كلمة البحث بغية الرجوع اليها اذا تكرر البحث عنها
search_date تاريخ البحث ويفيد التاريخ في حذف الحقول اذا كان التخزين مؤقت او استخراج نتائج جديدة للمشاركات التي اضيفت بعد هذا التاريخ اذا كان التخزين دائم
الحقل articl_date والحقل articl_order
للبحث المتقدم اذا اختراح الباحث تاريخ معين للبحث بواسطة وا الثاني طريقة العرض من الاقدم للاحدث
والحقل articl_max هو عدد المواضيع التي وجد بها كلمة مشابة لكلمة البحث

أنشاء فهارس خاصة
من الطرق الاضافية لمعالجة البحث هي تخزين الكلمات المكتوبة في المقال كل واحدة على حدى بدون تكرار نفس الكلمة في نفس المقال
وتحفظ داخل جدول جديد search_words

كود:
CREATE TABLE search_words (
  postid int(12) unsigned NOT NULL default '0',
  word varchar(50) NOT NULL default '',
  KEY word(word)
);
الفائدة :
في حالة البحث يتم البحث في الجدول search_words
في الحقل word وتعرض النتائج بناء على postid وهذه الطريقة استخدمتها في برنامج الداعية الالكتروني بالاضافة الى حقل جديد
هو cat int(10) NOT NULL default '0',
هذا الحقل يحدد اذا القسم الذي توجد به المشاركة هل هي في المقالات او القصص او الفتاوي وتم تطبيقة على سته اقسام تقريبا
جرب البحث في موقع الاسلام للجميع
http://www.alislam4all.com
وبحث عن كلمة رسالة

ومع ان البرنامج كتب باحدث الاساليب الى انه لازال ينقصة بعض التطوير الذي اتمنى ان اقوم به مستقبلا ان شاء الله
ومع اني اخترت هذا الاسلوب ولكن الافضل هو انشاء فهارس للحقول داخل الجداول كما في جدول المقالات السابق ولكن في الداعية الالكتروني استفيد بان البحث يتم في كل الاقسام وهذا ما تفتقر له مجلة المبرمج العربي وجميع المجلات التي نجهل الكثير من خطورت نصوصها البرمجية

نعود لجدولنا search_words يعتبر فهرس قمنا بانشائه ونتولى معالجة البحث فيه وهذا الجدول لا يستغني عن الجدول search_results اذا اردنا ان نتقن العمل ويكون البرنامج قادر على استيعاب الكثير من النصوص

تخزين الكلمات داخل الجدول search_words
يجب ان نضع ضوابط لحفظ الكلمات المدخلة في هذا الجدول
اولا : يمنع حفظ الكلمات التي تستخدم بستمرار في النصوص ولا يفترض ان يتم البحث عنها مثل ( حروف الجر , أن واخواتها .... الخ )

ثانيا : عدم حفظ الكلمة اكثر من مرة اذا تكررت في نفس النص

ثالثا : عدم حفظ وسوم html او اي اختصارات خاصة ببرنامجك مثل الابتسامات ...... الخ

رابعا : تحفظ الكلمات والرقم الخاص بالمشاركة التي توجد بها الكلم حتى نصل لها بشكل سريع

خامسا : لا تحفظ الا كلمات تتكون من حروف او ارقام وحروف معدى ذلك يتم استبعادة

جميع هذه الشروط قمت بكتابتها داخل دالة لبرنامج الداعية الالكتروني
وهي



كود PHP:
    function search_words($postid,$post,$cat)
    {
      global 
$db;
        
$post strip_tags($post);
        
$post preg_replace('/\s/'' '$post);
        
$post preg_replace('/[^a-z0-9أ-ي\-_ ]/'' '$post);
        
$post preg_replace('/\s{2,}/'' '$post);
        
$post trim($post);
        
$words explode(' '$post);
        
$words array_unique($words);
        foreach(
$words as $word)
        {
            if( 
strlen ($word) > )
            
$db->query("INSERT INTO searchwords (postid, word, cat)
                                                 VALUES
                                                ($postid, '$word','$cat')"
);
        }
    } 
مع العلم ان الجدول يحتوي على حقل اضافي لتحديد القسم

واعود واكرر ان الطريقة المثالية هي انشاء فهارس داخل نفس الجداول كما تم على جدول المقالات السابق articles

الطريقة المثالية لاجراء استعلام وبحث سريع في MySql
دراسة وتحليل : رفيع العتيبي
المصدر
http://www.rafiaphp.com/news.php?action=view&id=74
-------------






__________________
مجموعة بي اتش بي العربية www.php4arab.org
البوابة العربية www.arabportal.net
rafia غير متواجد حالياً   قديم 23-10-2003, 11:25 AM
عضو نشيط جدا
تاريخ التسجيل: Jun 2003-
#2 (permalink)  

جزاك الله خير ..

درس ممتع يستحق القراءه على رواقه

مع اني ما احتاجه الان لكن لماذا لا ساحتاجه لاحقا ً

و تقبل تحياتي ..






__________________
[CENTER]احمدك ياربي على نجاتي من موت محقق بلا محاله

العارف - ادارة فيبولتن العربيه
\\ فيبولتن العربيه _ vBulletin-arab //

[]انتظرووو Golden Board ... اسطوره في عالم الانترنت بإذن الله[]
. . .[/CENTER]
al3arf غير متواجد حالياً   قديم 23-10-2003, 01:49 PM
عضو فعال
تاريخ التسجيل: Feb 2003-
#3 (permalink)  

للاسف مثل هذا الموضوع في الاسفل






aldosari غير متواجد حالياً   قديم 23-10-2003, 03:55 PM
مشرف تطوير المواقع
تاريخ التسجيل: Apr 2001-
#4 (permalink)  

الله لا يضرك ما شاء الله .

لا أستطيع أن أقول درس . و لكن اقول مرجع لكل مبرمج .

بارك الله فيك

مع التحية اخوك ابو مشعل






__________________
أخوكم ابو مشعل
ملاحظات لتنظيم المنتدى:
http://www.swalif.net/softs/showthread.php?s=&threadid=42612
---------------
ابو مشعل غير متواجد حالياً   قديم 23-10-2003, 04:21 PM
عضو نشيط
تاريخ التسجيل: Feb 2003-
#5 (permalink)  

بارك الله في جهودك وجزاك الله خير






__________________
>> .... <<
^FaWaZ.NeT^ غير متواجد حالياً   قديم 23-10-2003, 05:25 PM
عضو نشيط
تاريخ التسجيل: Nov 2002-
#6 (permalink)  

اقتباس:
رد مقتبس من ابو مشعل
الله لا يضرك ما شاء الله .

لا أستطيع أن أقول درس . و لكن اقول مرجع لكل مبرمج .

بارك الله فيك

مع التحية اخوك






__________________
مَلفْاتي لتحميل الصور والملفات
تحميل بلا حدودْ، بلا قيودْ

رفعُ المَلفاتْ مجاناً تصل الى 250 MB
Hajer4des غير متواجد حالياً   قديم 23-10-2003, 05:53 PM
عضو نشيط جدا
تاريخ التسجيل: Sep 2003-
#7 (permalink)  

اقتباس:
رد مقتبس من ابو مشعل
الله لا يضرك ما شاء الله .

لا أستطيع أن أقول درس . و لكن اقول مرجع لكل مبرمج .

بارك الله فيك

مع التحية اخوك ابو مشعل






__________________
منتديات برامج العرب عندما يختلط الخيال بالحقيقة

تفضلوا بزيارة المنتديات

www.3rabw.com/vb
azizman غير متواجد حالياً   قديم 24-10-2003, 01:08 PM
عضو نشيط جدا
تاريخ التسجيل: Oct 2003-
#8 (permalink)  

ممتاز والله اخوي رفيع تسلم والله يكثر من امثالك






__________________
www.saleh.cc
Mr.Saphp متواجد حالياً   قديم 25-10-2003, 03:43 PM
عضو فعال جدا
تاريخ التسجيل: Feb 2002-
#9 (permalink)  

شكرا لك اخي رفيع على هذا الدرس الجميل وفقك الله لما يحبه ويرضاه


اخي رفيع لدي فقط تساؤل حول نقطه في الدرس

وهي هذه النقطه

أنشاء فهارس خاصة
من الطرق الاضافية لمعالجة البحث هي تخزين الكلمات المكتوبة في المقال كل واحدة على حدى بدون تكرار نفس الكلمة في نفس المقال
وتحفظ داخل جدول جديد search_words



كود PHP:
-CREATE TABLE search_words (
  
postid int(12unsigned NOT NULL default '0',
  
word varchar(50NOT NULL default '',
  
KEY word(word)
); 
اتمنى ان تزيد من الأيضاح لو امكنك ذلك

شكرا لك






__________________
مؤسسة المهمات البرمجية
00966507585887
0507585887


www.mr-php.com.sa
www.mr-php.com
المهمة9 غير متواجد حالياً   قديم 26-10-2003, 12:09 AM
عضو نشيط
تاريخ التسجيل: Apr 2003-
#10 (permalink)  

السلام عليكم ورحمة الله
وجزاكم الله خير الجزاء ومبروك عليكم بلوغ الشهر الكريم
واتمنى ان يكون الدرس مفيدا للجميع

----------
اخي المهمة9 بنسبة للفكرة التي لم تتضح لك

لدينا برنامج مقالات على سبيل المثال يحفظ نص المقال في جدول اسمة articles مثل ما ذكرنا في الدرس

يضاف جدول خاص بفهرست المقال في الجدول search_words
ولنفرض ان نص المقال
اقتباس:
يعتبر الفهرس index في MySql افضل الخصائص التي تساعد في سرعة الحصول على البينات المطلوبة .
يعتبر الفهرس فريد اذا كانت كل قيمة فيه تختلف عن غيرها
كامل النص سوف يحفظ في الجدول articles اما جدول search_words
تحفظ فيه الكلمات كل حقل فيه كلمة واحدة هكذا
يعتبر
الفهرس
index
MySql
افضل
الخصائص
التي
تساعد
سرعة
الحصول
البينات
فريد
قيمة
تختلف
غيرها
لو تلاحظ ان بعض الكلمات تكررت في النص مثل كلمة الفهرس
لكن لم تحفظ الى مرة واحدة
هذا المقصود
تخزين الكلمات المكتوبة في المقال كل واحدة على حدى بدون تكرار نفس الكلمة في نفس المقال

في التطبيق قمنا بوضع الكلمات في مصفوفة ثم قمنا بتمريرها على الدالة array_unique والتي تمنع تكرار اي عنصر في نفس المصفوفة

---------
ولكن mysql تقوم بدور الفهرسة باعطاء الحقل خاصية فهرسة مثل جدول المقالات السابق FULLTEXT KEY text(text)
تغنيك عن انشاء جدول وحفظ الكلمات الموجودة داخل هذا الجدول
ان شاء الله اتضحت الفكرة لديك






__________________
مجموعة بي اتش بي العربية www.php4arab.org
البوابة العربية www.arabportal.net
rafia غير متواجد حالياً   قديم 27-10-2003, 07:54 AM
عضو نشيط جدا
تاريخ التسجيل: Jun 2003-
#11 (permalink)  

هلا اخوي رفيع....
وكل عام وانت بخير
صراحة موضوع أكثر من رائع، وزي ماقال اخوي ابومشعل (مرجع لكل مبرمج).

وصراحة وانا اقراء الموضوع، جأت فكرة في راسي وهي:

البحث ضمن النتائج الحالية

وهي الموجودة في محرك Google.com، فأساس الفكرة زي ماتفضلت تخزين كلمات البحث الاكثر استخداماً، وكذلك تخزين نتائج البحث في جدول

search_result

وعند ظهور نتائج البحث للزائر، يوجد خاصية او ميزة (البحث ضمن النتائج الحالية)

وهي صفحة تبحث كل عن مبتغاك في جدول search_result (نتائج البحث)
علماً بانه تبحث لك عن النتائج التي استخرجتها من البحث الاول، وليس البحث بكامل الجدول search_result !!!

لكن، المعضلة الكبيرة هنا
لو صادف اكثر من شخص او 10 اشخاص في نفس الوقت بحثوا عن كلمة (رسالة)، ماذا يــحدث ؟؟

ياليت توضح لي هذا الاستفسار ؟


تحياتي القلبية لك






__________________
We provide you all ways to contact with others.
نقدم لكم افضل العروض لرسائل الجوال وبرمجيات رسائل الجوال
SMS FREE
www.Mysms.Tv
Php4Mee غير متواجد حالياً   قديم 27-10-2003, 04:06 PM
موضوع مغلق


أدوات الموضوع

تعليمات المشاركة
لا تستطيع كتابة مواضيع
لا تستطيع كتابة ردود
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

كود [IMG] متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة



الساعة الآن: 01:37 PM بتوقيت المملكة العربية السعودية