Üzerinde çalıştığımız proje kapsamında bir alan içerisinde virgülle ayrılmış sayısal ifadeler tutuyoruz. Bu alan ilgili satırın kullanıldığı farklı içeriklerin id numaralarını tutmakta. Tabi yeri geldiğinde bunları tekrar parse etmek gerekiyor.
Özellikle bu id numaralarına göre çekeceğimiz verileri belirlemek için LIKE komutu pek işe yaramıyor çünkü LIKE hem istediğimiz sayıyı çekiyor hemde bu sayıyı içeren başka sayıları da çekebiliyor. Örneğin aradığımız sayı “1″ ise LIKE komutu ile içerisinde “1″ geçen tüm sayılar geliyor. Bu da bizim istediğimiz bir durum değil açıkçası.
Bu işi nasıl yaparız nasıl ederiz diye kafa yorarken bu işi PHP tarafında yapmaktansa MySQL tarafında yapmanın daha güzel olacağını düşünüp bunun yollarını araştırdım. Tabi ilk baktığım yer olan (ki genelde hep resmi belgelendirmelere bakarım) MySQL belgelendirme sayfaları oldu.
Bu noktada MySQL içerisinde regex ifadelerinin kullanılabildiğini ve bununla ilgili bir kaç örneğe (bayağı fazla örneklere) ulaştım. İşimizi görecek çok güzel bir yapı oluşturduk kendimize, buyrun komutumuz:
SELECT ids FROM mytable WHERE ids REGEXP '[[:<:]]aranan[[:>:]]';
Daha bir çok ilginç ifade mevcut. Sanırım zaman buldukça daha detaylı olarak inceleyeceğim.
MySQL Regex Sayfası: http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp
Peki performansi nasil?
Kullanılan tablolar çok fazla veri olmadığı için net bir şey söylemek doğru olmaz tabi ama phpmyadmin de yaptığımız sorgular bayağı iyiyidi aynı şekilde yazılım tarafındada testler sırasında bir performans kaybı olmadı.
Fakat topu topu 100 kayıt bile yoktur tablo içerisinde
daha büyük tablolar üzerinde deneme fırsatım olursa daha iyi olacak sanırım
REGEXP kullanışlıdır ama burada kullanmak zorunda olmaman lazım. DB yapısında bir problem var gibi geldi bana. Doğrusu için http://www.kodaman.org/yazi/relational-database-iliskisel-veritabani-yapisi adresinde kısa bir anlatım mevcut.
Veri tabanı yapısı ile ilgili bir sorun yok. Çünkü alanda veriler sayısal olarak virgülle ayrılmış olarak tutuluyor. 1,2,3,4,5…. vb gibi. Bunun sebebi her bir satırın her bölüm için aynı değeri almak zorunda olması. Yani var olan satırdaki bilgiler bölüm ne olursa olsun aynı olmak zorunda. Bu nednele bolum numarlarını bir alanda virgül ile tutuyorum. Böylece aynı verileri tekrar tekrar girmiş olmuyorum.
Merhaba,
‘$aranan’ değişkeninin tipi text olunca çalıştıramadım. int yapınca çalıştı
Benim kullandığım tip varchar. Text ile denemedim bir ara deneyip tekrar bilgi yazarım.
arkadaşlar, dump’ı 100mb’lık bir veri tabanında doğru yazılan e-postaları listelemek için distinct ve “limit x,30″ ile beraber regex kullanıyorum. normal bir donanım ile, 6 saniye sürüyor görüntülemesi. birde paging için aynı sorguyu kullanmam gerekecek, nasıl olacak bu iş bilmiyorum ama yapacağız bir şekilde =).