MySQL өгөгдлийн сангаас хүснэгтийн тодорхой нөхцөл хангах мөрийг SELECT хийх буюу өгөгдөл гаргаж авахад WHERE түлхүүр үгийг ашигладаг. id=19 гэх мэтээр тухайн талбар бүхэлдээ ямар утгатай байхыг шалгах нь бараг хэнд ч мэдээжийн зүйл юм. Харин текст мэтийн ихээхэн хэмжээний өгөгдлийн хувьд ингэж хайх нь боломжгүй. Ийм тохиолдол LIKE ба REGEXP зэрэг түлхүүр үгсийг ашиглан хайлт хийдэг. Мөн Full Text Search гэх хайлт байдаг ч бид энд авч үзэхгүй.

LIKE хайлт

LIKE түлхүүр ашиглана. Доорх жишээнд content нэртэй хүснэгтийн abstract эсвэл text нэртэй багануудын аль нэгэнд нь galaa гэсэн үгийг агуулсан үг орсон мөрийн id дугаарыг ялгаж авах синтакс бичигдсэн байна.

SELECT `id` FROM `content` WHERE `abstract` LIKE '%galaa%' OR `text` LIKE '%galaa%'

Хэрвээ '% galaa%' гэвэл galaa гэж эхэлсэн үг, '%galaa %' гэвэл galaa гэж төгссөн үг, харин '% galaa %' гэвэл зөвхөн galaa гэсэн үг хэмээн ойлгож болно.

90 шахам мөртэй багахан хүснэгтийн хувьд дээрх SQL синтакс дунджаар 0.019 секундэд хэрэгжиж байна.

REGEX хайлт

REGEXP түлхүүр үг ашиглана. Дээр бичсэн синтаксийг regular expression ашиглахаар болгож өөрчилбөл

SELECT `id` FROM `content` WHERE `abstract` REGEXP 'galaa' OR `text` REGEXP 'galaa'

болно. Мөн дээрхийн адилаар эхлэл төгсгөл зэргийг заая гэвэл ^ ба $ тэмдэгтүүдийг ашиглаж болох төдийгүй өөртөө хэрэгтэй дурын нөхцлийн хэвийг бичиж болно.

Биелэх хугацааны хувьд өмнөхөөс харьцангуй удаан тодруулбал дунджаар 0.077 секунд байлаа.

Харьцуулалт

Хурдны хувьд мэдээж LIKE нь илүү сайн, бараг 4 дахин хурдан ажиллаж байна.

Хэдийгээр REGEXP нь гүйцэтгэлээр дутуу ч гэлээ regular expression ашиглах учраас илүү нарийн нийлмэл таамаглалыг шалгах, жишээлбэл олон тооны LIKE-ийг ганц REGEXP-ээр орлуулах боломжтой. Жишээ болгон php, mysql, regex, pattern гэх дөрвөн үгний аль нэгийг агуулсан бичлэгийн id ба title-ийг гаргаж авах синтакс бичие. LIKE ашиглавал

SELECT `id`, `title` FROM `content` WHERE `text` LIKE '%php%' OR `text` LIKE '%mysql%' OR `text` LIKE '%regex%' OR `text` LIKE '%pattern%'

гэж бичих бол REGEXP-двэл ердөө

SELECT `id`, `title` FROM `content` WHERE `moretext` REGEXP 'php|mysql|regex|pattern'

гээд л болно. Хоёрдахь синтакс цомхон боловч гүйцэтгэлээрээ урьдын адил (4.5 дахин удаан) сул үр дүнг үзүүлсэн хэвээрээ байна.