MySQL: השוואה LIKE נגד REGEXP

בקטגוריה: טיפים והערות|יעילות|שפות תכנות

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) ועוד.

Zend Certified Engineer

  • דניאל: אחלה של מאמר. [...]
  • Shay | Exalted Web: אין סיבה שיהיו תווים מוזרים. פשוט שמור הכל בutf8, כולל את הdatabase, הhtml והphp, ואל תשכח להריץ שאי [...]
  • יונתן: אין לך בעיה עם תווים בעברית מהמסד? כל מה שאני שולף מוצג לי בתווים מוזרים.. [...]
  • Shay | Exalted Web: שמחתי לעזור :) [...]
  • יהונתן|YtsWeb: שי,תודה רבה על המאמר. חיפשתי באמת איך לחלק את העמודים בצורה טובה ושלא יראו 1000 מספרים. [...]

פרוייקט תכנות מונחה עצמים

פרויקט תכנות מונחה עצמים עוסק בפרדיגמת תכנות מונחת עצמים. נושא רחב ובעל השפעה עצומה, אך ללא הסברים כמעט בעברית.
דף הפרוייקט

קצת מידע

אחלק לפניכם את האתר לשלושה נושאים:

  • פוסטים כלליים, מפורסמים באופן שוטף באתר.
  • טיפים והערות, שיפורסמו באופן לא עקבי, ימוספרו ויתנו מידע מתומצת.
  • פרוייקטים. בכל כמה זמן אפתח פרוייקט שיעסוק במשהו. כל פרוייקט ימשך כשבוע ומטרתו תיהיה לאסוף מידע ותוכן רב לגבי נושא כלשהו שיקבע על ידי מראש.