Zoque.Forum
Dirsek Teması:
Geri Dön Zoque.Forum » Webmaster Kaynaklari » Sunucu Tabanlı Programlama (Server Side) » Veritabanları » [ MYSQL ] Full-text aşırı yavaş ?


Yanıt
 
LinkBack Seçenekler
Old 14.06.2007   #1 (permalink)
 
Denwer's Avatar
 
Üyelik Tarihi: 24.02.2003
Yer: İstanbul
Yaş: 23
Mesaj: 92
[ MYSQL ] Full-text aşırı yavaş ?


Full-text ile yaptığım sorgulamalar aşırı derece yavaş kalıyor. Tablo yapılarım aşağıdaki gibi , kullanıcılar tablomda 9867 adet kayıt var ( rastgele oluşturulmuş kayıtlar ) , bu kayıtlardan ad alanında en fazla tekrarlanan kayıt Deniz (1949 adet), diğer isimler en fazla 11 defa tekrarlanmış.


SELECT SQL_CALC_FOUND_ROWS kullanicilar.KullaniciNo, Ad, Soyad, Hash
FROM kullanicilar_iletisim,kullanicilar
WHERE
(Match(Ad) Against ('Deniz' In Boolean MODE))
AND (Ulke=90)
AND ( kullanicilar_iletisim.KullaniciNo = kullanicilar.KullaniciNo )
Order By Ad,Soyad
Limit 0,50

Şeklinde bir sorgu kullandığım zaman sorgunun tamamlanması 2dk'yı buluyor, Full Text yerine Ad alanını Like ile sorgulattığım zaman ise en fazla 2 sn içinde sonuçlar geliyor. Kabul , bir yerde büyük bir hata yapıyorum ama nedir bulamıyorum, sorunun sebebi ve olası çözümü sizce ne olabilir ?


Saygılarımla.


=====================

Tablo yapılarım :

CREATE TABLE `kullanicilar` (
`KullaniciNo` bigint(20) unsigned NOT NULL auto_increment,
`Ad` varchar(40) default NULL,
`Soyad` varchar(40) default NULL,
`Email` varchar(150) default NULL,
`Parola` varchar(50) default NULL,
`SonGiris` datetime default NULL,
`UyelikBaslangic` int(10) unsigned default NULL,
`UyelikDurum` smallint(5) default '1',
`UyelikDITarih` date default NULL,
`UyelikIDGerekce` text,
`OnayKodu` varchar(15) default NULL,
`GeciciParola` varchar(50) default NULL,
`GeciciParolaTarih` timestamp NULL default NULL on update CURRENT_TIMESTAMP,
`Hash` varchar(42) default NULL,
PRIMARY KEY (`KullaniciNo`),
FULLTEXT KEY `Email` (`Email`),
FULLTEXT KEY `Soyad` (`Soyad`),
FULLTEXT KEY `Ad` (`Ad`)
) ENGINE=MyISAM ;


CREATE TABLE `kullanicilar_iletisim` (
`SiraNo` bigint(20) unsigned NOT NULL auto_increment,
`KullaniciNo` bigint(20) unsigned default NULL,
`MSN` varchar(100) default NULL,
`Yahoo` varchar(100) default NULL,
`Skype` varchar(100) default NULL,
`Google` varchar(100) default NULL,
`web` varchar(150) default NULL,
`IsTel` varchar(40) default NULL,
`CepTel` varchar(40) default NULL,
`Adres` tinytext,
`Sehir` int(10) unsigned default NULL,
`Ulke` int(10) unsigned default NULL,
`EmailAcik` varchar(150) default NULL,
PRIMARY KEY (`SiraNo`),
KEY `Sehir` (`Sehir`),
KEY `Ulke` (`Ulke`)
) ENGINE=MyISAM ;


==

-> SELECT COUNT( Ad ) AS Adet, Ad FROM `kullanicilar` GROUP BY Ad ORDER BY Adet DESC LIMIT 0 , 5
Adet| Ad
-------------
1949 | Deniz
11 | Akı
11 | Tagay
11 |Bengi
11 | Yağmur

MySQL Versionu : 5.0.24a-Debian_9ubuntu2-log / Ubuntu 6.10
__________________
/dev/mach
Denwer şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 15.06.2007   #2 (permalink)
 
stalker's Avatar
 
Üyelik Tarihi: 01.11.2000
Yer: İstanbul
Yaş: 27
Mesaj: 713
Re: [ MYSQL ] Full-text aşırı yavaş ?

Tabloları JOIN ile birleştir

SELECT kullanicilar.KullaniciNo, Ad, Soyad, Hash
FROM kullanicilar_iletisim
INNER JOIN kullanicilar ON ( kullanicilar_iletisim.KullaniciNo = kullanicilar.KullaniciNo )
WHERE
(Match(Ad) Against ('Deniz' In Boolean MODE))
AND (Ulke=90)
Order By Ad,Soyad
Limit 0,50
__________________
life is better without braces
stalker şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 15.06.2007   #3 (permalink)
 
Denwer's Avatar
 
Üyelik Tarihi: 24.02.2003
Yer: İstanbul
Yaş: 23
Mesaj: 92
Re: [ MYSQL ] Full-text aşırı yavaş ?

Malisef sonuç değişmedi : Showing rows 0 - 49 (50 total, Query took 85.1286 sec) :=(

3-5 döküman, bolca yolunmuş saç ve bir sürü denemeden sonra şöyle birşey ortaya çıktı : Fulltext aramalar'da sorgu karışık olduğu zaman aşırı derecede yavaşlama oluyor, tek bir tabloda fulltext kullanmak gayet hızlı ama işin içine 2+ tablo girdiği zaman hele ki bu tablolarda where ile fulltext alanlardan başka filtreleme yapılıyorsa MySQL kendini kaybediyor.

Sorunu çözmek için aşağıdaki gibi bir yola başvurdum :

İhtiyaçlarım :
- Aramalarıma sonucunda ad,soyad ve email alanları geri dönmeli
- Ad, Soyad, Firma Adı, Ülke, Şehir, İlgi alanları ( bu alan 3. bir tabloda, sonradan eklendi ve sorguyu dahada yavaşlattı ) 'na göre arama yapabilmeliyim.

Okuduğum dökümanlarda fulltext'in mümkün olduğunca bu tarz karşık sorgularda kullanılmaması söyleniyordu, bende fulltext'i sadece sonradan eklenen 2. tablomdaki İlgialanları kolonunda kullanmaya karra verdim. Ardından ilk iş olarak Sehir ve Ulke alanlarını kullanıcılar tablosuna taşıdım, bu yazılım kısmında fazla sorun çıkarmayan bir değişiklik idi bu sayede kullanmam gereken tablo sayım 2'ye düştü. Ad ve soyad alanlarında klasik Like kullanmaya karar verdim, like kullanmak pek sorun teşkil etmedi ( iyi-kötü tartışılır ). SQL_CALC_FOUND_ROWS 'i kullanmak durumunda kaldım , çünkü sayfalama yapmam gerekiyordu ( :=( ). Açıkcası ilk sorumdan biraz uzaklaştım gibi gözüküyor, neyse sonuç aşağıdaki gibi birşey oldu :

SELECT SQL_CALC_FOUND_ROWS kullanicilar.KullaniciNo, Ad, Soyad, Hash
FROM kullanicilar Inner Join kullanicilar_isdetay On ( kullanicilar_isdetay.KullaniciNo = kullanicilar.KullaniciNo )
WHERE
(Ad Like 'Deniz%' AND Ulke=90) AND (Match(IlgiAlanlari) Against ('Linux' IN Boolean MODE)) Order By Ad,Soyad Limit 0,50


Query took 0.2266 sec

Kaygım Ad alanınında like kullanmamın ileride yavaşlık çıkarması fakat açıkcası 2-5sn arasındaki sorgulamalar kabul edilebilir gibi geliyor.


Bitirmeden önce sanırım fulltext için öğrendiklerimi kısaca yazmam faydalı olacaktır :

- Sorgularınızda Limit kullanın.
- Fulltext aramalarınızda Select Count(*).. gibi bir şey kullanmayı denemeyin bile , açıkcası kendi durumumda sorgu tamamlanana kadar kahvemi hazırlamış ve çoktan yarılamış oluyordum. Fazladan bir sorgu daha yapın ve SQL_CALC_FOUND_ROWS'i kullanın.
- Tablonuzu belli zamanlarda ( belli sayıda kayıt girişinden sonra ) optimize edin.
- Sunucu kendi kontrolünüzde ise Sphinx ( http://www.sphinxsearch.com ) kullanmanız işleri kolaylaştırabilir, denemedim ama deneyenler memnun gibi.
- Sıralama yaparken fulltext alanları kullanmayın ( Fulltext'i skor işlemi için kullanıyor olsanız dahi sıralamaya dahil etmeyin ).
- Ve en önemlisi tüm bu işlemler sırasında yada bu mesajı okurken lcd monitörünüzde birden nereden geldiği belli olmayan ve ortalama bir kiraz ebatlarında bir örümcek belirirse sakin olun, panik yapmayın. En yakınızıda bulunan sözlüğü (örn. Redhouse , ~1 KG) misafiriniz monitörünüzü terk edip masa üstüne indikten sonra yaklaşık 60 cm'den bırakın ve bir spatula aramaya başlayın ( spatula bulamazsanız, sevmediğiniz bir iş arkadaşınızın kartvizitini kullanabilirsiniz aynı görevi başarı ile yerine getiriyor) ...


Unutmadan : http://www.mysqlperformanceblog.com/ , güzel bilgiler var.


Saygılarımla.
__________________
/dev/mach
Denwer şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Old 16.06.2007   #4 (permalink)
mow
 
Üyelik Tarihi: 28.03.2003
Yer: İzmir
Yaş: 26
Mesaj: 762
Re: [ MYSQL ] Full-text aşırı yavaş ?

daha önce problemin bir benzerini yaşadım, aslında tablonun çokluğuyla değilde daha ziyade arama kriterlerinin fazlalığı çok yavaşlatıyor, önce fulltext i arıyor sonuçları alıyor daha sonra eklediğin her bir kriter ile bu sonuçları tekrar sorguluyor.

key_buffer_size ı abartarak yükselttim, indexin boyutunu küçültmek için türkçe karakterleri uygun şekilde düzenleyip latin1 haline getirdim tekrar index aldım ve sorguyu geçici tabloya taşıyıp oradan seçtirdim benim için yeterli olmuştu.
mow şu an çevrimdışı  
Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Spurl'e kaydet! http://reddit.com/submit?url=%url%&title=%title%Wong'e kaydet!Yahoo'ya kaydet!Google'a kaydet!MSN'e kaydet!Facebook'e kaydet!
Mesajdan alıntı yaparak yeni bir cevap ekleyin
Sponsorlu Bağlantılar
Zoque.Forum
Reklam
Yanıt

Etiketler

mysql , fulltext , asiri , yavas



 
Zoque'a hoşgeldiniz!
Zoque 27.02.1999 tarihinde yayın hayatına başlamış, paylaşıma dayalı bir oluşumdur. Tasarım, teknoloji, web, kültür ve sanat ana başlıkları altında bilgi paylaşımı ve benzer değerlere sahip katılımcıların birbirleriyle iletişime girmelerine imkan sağlar. "Az ama Öz" sloganından yola çıkarak, kaliteli ve nitelikli katılımı temel alır.

Saygın ve ciddi bir ortamda yardımlaşmak, haberleşmek, kendi bildiklerini diğer katılımcılarla paylaşmak isteyen, oluşumumuza düzenli katılımda bulunacağı inancını taşıyan konuklarımızı üye olmaya davet ediyoruz. [ » ]


Üye Girişi:

UslanmaM baktabul.com TEKplatform TEKplatform

En popüler ilk 100 etiket
Tag Cloud
acil adsl ajax almak arama araniyor ariyorum ariyoruz asp bilen bilgi bilgisayar blog calisma canon css dijital div domain dosya eleman film firefox flash font form forum fotograf freelance google gore grafik grafiker hakkinda hangi hata hatasi hosting html ilgili ilk image internet istanbul istiyorum java javascript karakter kayit kisisel kullanimi link logo mac mail menu muzik mysql nasil neden nedir online photoshop php problemi program programi reklam resim satilik sayfa script server ses sistemi site sitesi son soru sorun sorunsali sorunu sql swf tasarim tasarimci tasarimcisi tasarimi turk turkce veri video web windows wordpress xml yardim yazi yeni zoque
Zoque RSS Aboneliği
Son eklenen konuları e-posta ile haber verelim mi?

Forum Yazılımı: vBulletin® Version 3.7.3 Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

Arayüz/Skin "Güneş" © www.zoque.com / net. Copyright © 1999 - 2008
Forum Saati GMT +2. Şu anda saat: 12:03.