בנית-אתרים.com – בלוג בנית אתרים
בקטגוריה: טיפים והערות|יעילות|שפות תכנות
2 ינו' 2011בMySQL ישנן שתי פעולות מעניינות לחיפוש במחרוזות. הראשונה היא LIKE והשניה היא REGEXP. לא אפרט וארחיב יותר מדי עליהן, את תפקודן המלא ניתן לקרוא באתר של MySQL להרחבה.
LIKE מאפשרת לנו להשתמש בסימן _ בכדי לתפוס כל תו שהוא וב% בכדי לתפוס כל רצף שהוא של תווים (כולל 0). REGEXP מאפשרת לנו להריץ ביטויים רגולוריים.
שימוש נפוץ לפעולות האלו הוא חיפוש בתוך מחרוזת. במאמר אבדוק את היעילות של כל אחת מהן, בבדיקה של האם מחרוזת מכילה תת מחרוזת, תפקיד ששתיהן תבצענה בקלות ותשגנה את אותה המטרה.
את המבחן אבצע עם שרת MySQL שמותקן לוקאלית על המחשב שלי. אצור טבלה עם עמודה id ועמודה name באורך 32 תווים. אכניס הרבה שורות (100,000) עם מידע שונה (md5 של מונה הלולאה) ואראה איזו מהשיטות יותר יעילה לחיפוש תת המחרוזת 5eda
הקוד שבו השתמשתי ליצירת הטבלאות והכנסת הנתונים הוא:
CREATE TABLE `tbl` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `name` CHAR(32) NOT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci' ENGINE=MyISAM ROW_FORMAT=DEFAULT; DELIMITER $$ CREATE PROCEDURE DO_INSERT() BEGIN DECLARE i INT DEFAULT 0; my_loop: LOOP INSERT INTO `tbl`(`name`) VALUES(MD5(i)); SET i = i + 1; IF i = 100000 THEN LEAVE my_loop; END IF; END LOOP my_loop; END $$ DELIMITER ; CALL DO_INSERT();
הקודים שבהם השתמשתי לשליפת נתונים עם LIKE וREGEXP הם:
SELECT * FROM `tbl` WHERE `name` LIKE '%5eda%';
SELECT * FROM `tbl` WHERE `name` REGEXP '5eda';
SELECT * FROM `tbl` WHERE `name` REGEXP '^.*5eda.*$';
התוצאות היו ברורות וחד משמעיות. בעת שימוש בLIKE קיבלתי זמן 0.046 ו0.062 שניות (כנראה בגלל caching), בעת שימוש בREGEXP בשיטה הראשונה קיבלתי זמן 0.125 ו0.144 שניות ובשיטה השנייה 0.328 ו0.344 שניות.
שתי הפעולות השיגו את אותו הדבר בדיוק, רק שLIKE הייתה מהירה פי יותר מ2.5 מREGEXP בשיטה הראשונה ופי 6.25 בשיטה השנייה!
שיהיה לכם שימוש מושכל!
שמי שי ואני בונה אתרים וכיום חותך (מקודד) ומתכנת.
אני עובד אל מול התקן העולמי של W3C, ומתכנת בשפת PHP תוך שימוש בטכנולוגיות עדכניות, תוך שמירה על קוד שניתן לתחזוקה.
בין כישורי נמנים: PHP, SQL, (X)HTML, CSS (2-3), XML, JavaScript ( + jQuery) ועוד.