Bir MYSQL Sorum Ve Bir De Node.Js+MYSQL Sorum [Uzman]
-
MYSQL Sorum (ilk soru) pek de uzmanlık gerektirmiyordur belki. Ama en iyi performans için bi formül arıyorum.
En performanslı random kayıt nasıl çekilir? (kısacası bu sorunun)
Açıklama: ORDER BY RAND() çok yavaşlatıyormuş ki gayet de öyle website test ile first byte datadan D alıyorum A veya B almam gerek.
İnternetteki tüm çözümleri uyguladım nerdeyse. (mysql random rows, mysql random select ve mysql random şeklinde aradım googleda)
Birisi özellikle kocaman bir döküman yazmış inner join ile randomu çarpıyor max(id) şeklinde alıyor ilk id son idden büyük veya eşitse seç gibi bir algoritma. Maalesef ki arada sırada random getiriyor ama 10tane sorgunun 9 unda ilk (veya son) id'yi getiriyor. Yani aynı yerde takılıyor.
---------------------
Bir diğer sorum ise Node.js ile alakalı aslına bakarsak javascript de denebilir.
Sorunun linki aslında şurada var bir başkası benim yerime sormuş ama cevap yok bunu da araştırdım ama bulamadım bir cevap:
Mysql ile connection.query ile çekiyoruz gelen sorguyu döngü içerisinde alıyoruz res.render ile gönderip jade'de değişken olarak okutmam gerek.
Eğer fonksiyon içerinde okutursam okuyor. Ama iki tane üç tane sorgu çekersem napacam ben?
Yani bana lazım olan phpde kullandığım gibi javascript ile şöyle birşey yazmam gerekli
var sonuc; connection.query(query, function(err, rows, fields){ if(err) throw err; sonuc = rows; }); console.log(sonuc);
Ama javascriptin özelliğinden dolayı (sanırım yani) o ilk belirtilen sonuç değişkeni fonksiyon içerisinde değiştirilirmiyor değer atanmıyor. Herşeyi denedim sanıyorum. Alternatif öneriniz var mı? (Örneğin mysql sorgusunda multiple query oluşturup throw err'den sonra res.rendere değeri atamak gibi buda hantal olur sanırım)
ÖZET: MYSQL ile olan sorunun özeti kalın yer. Node.js i özetle anlatamıyorum kodu okusanız yeter sanıyorum.
-
Eğer kendimi düzgün ifade edememişsem affola hocalar dilim döndüğünce tekrar anlatmaya çalışırım gerekirse fotolarla felan desteklemeye çalışırım. Benim için ölümcül bir sıkıntı sırf bu yüzden php'ye dönmek üzereyim ama istemiyorum node.jste sınırsız modül olayı ve c ile plugin yazma kısmı beni cezbediyor...
-
hocam ilk olarak connection.query( fonksiyonu asenkron çalışıyor yani şuandaki yazdığın kod ile console.log sorgudan daha önce çalışabilir. console.log u query fonksiyonun içine geçiceksin php gibi değil. veya bu connection.query nin senkron şeklinde çalışanı var ise onu kullanman lazım onu yapabilmen için
ikincisi asenkron çalışıyor dedik, sen senkron ilerlemen için ikinci sorgunu birinci sorgunun cevabı döndüğü yerden başlat ki sırayla devam etsin sen bütün verileri çekince işlerini bitirince yine en son query nin içinde jade ye yollarsın benim bildiğim budur
edit hantal olur demişsinde ben hep böyle kullandım sorguları değilse asenkron olayından dolayı düzgün çalışmaz. bide jade kullanma benden tavsiye cpu performansı çok kötü
-
detCode bunu yazdı
hocam ilk olarak connection.query( fonksiyonu asenkron çalışıyor yani şuandaki yazdığın kod ile console.log sorgudan daha önce çalışabilir. console.log u query fonksiyonun içine geçiceksin php gibi değil. veya bu connection.query nin senkron şeklinde çalışanı var ise onu kullanman lazım onu yapabilmen için
ikincisi asenkron çalışıyor dedik, sen senkron ilerlemen için ikinci sorgunu birinci sorgunun cevabı döndüğü yerden başlat ki sırayla devam etsin sen bütün verileri çekince işlerini bitirince yine en son query nin içinde jade ye yollarsın
Yani fonksiyon içinde fonksiyon halinde mi çalıştırıyım hocam? Nested mi ne deniyor galiba ingilizcem pek iyi değil de şöyle:
connection.query(blabla){ if(err) throw err; var sonuc1 = rows; connection.query(blabla){ if(err) throw err; var sonuc2 = rows; res.render({ sonuc1 = sonuc1, sonuc2 = sonuc2 }); });
Eğer bunu kastediyorsan sanki atıyorum 5 kayıt olursa bir daha bakmam imkansızlaşacak yani uzar gider içi sanki? Zaten performans için maksimum 4 farklı query çalıştırırım da o ayrı...
@detCode
Edit: Jade kullanma demişsin hocam syntax'ı çok hoşuma gidiyor başka ne önerin var?
by_Tet tarafından 27/Haz/15 00:37 tarihinde düzenlenmiştir -
by_Tet bunu yazdıdetCode bunu yazdı
hocam ilk olarak connection.query( fonksiyonu asenkron çalışıyor yani şuandaki yazdığın kod ile console.log sorgudan daha önce çalışabilir. console.log u query fonksiyonun içine geçiceksin php gibi değil. veya bu connection.query nin senkron şeklinde çalışanı var ise onu kullanman lazım onu yapabilmen için
ikincisi asenkron çalışıyor dedik, sen senkron ilerlemen için ikinci sorgunu birinci sorgunun cevabı döndüğü yerden başlat ki sırayla devam etsin sen bütün verileri çekince işlerini bitirince yine en son query nin içinde jade ye yollarsın
Yani fonksiyon içinde fonksiyon halinde mi çalıştırıyım hocam? Nested mi ne deniyor galiba ingilizcem pek iyi değil de şöyle:
connection.query(blabla){ if(err) throw err; var sonuc1 = rows; connection.query(blabla){ if(err) throw err; var sonuc2 = rows; res.render({ sonuc1 = sonuc1, sonuc2 = sonuc2 }); });
Eğer bunu kastediyorsan sanki atıyorum 5 kayıt olursa bir daha bakmam imkansızlaşacak yani uzar gider içi sanki? Zaten performans için maksimum 4 farklı query çalıştırırım da o ayrı...
@detCode
evet hocam dediğim bu içi uzayıp gidiyor zaten başka bi yolu varmı bilmiyorum ben hep böyle kullanıyorum. senkron çalıştırmak için başka bi yol olabilir ama araştırmak lazım
-
Node.js falan bilmem ama iç içe fonksiyonu şu şekilde yapabilirsin gibi geldi bana.
function runQuery(query_arr,sira){ connection.query(query_arr[sira]){ if(err) throw err; var sonuc1 = rows; sonuclar.append(rows); runQuery(query_arr, sira+1) }); } sonuclar = [] query_arr = ["aaa","bbbb", "ccc", "ddd", "eee"] runQuery(query_arr, 0); console.log(sonuclar);java
-
detCode bunu yazdıby_Tet bunu yazdıdetCode bunu yazdı
evet hocam dediğim bu içi uzayıp gidiyor zaten başka bi yolu varmı bilmiyorum ben hep böyle kullanıyorum. senkron çalıştırmak için başka bi yol olabilir ama araştırmak lazım
Hocam yalnız çok sıkıntı böyle mutlaka bir çözümü olmalı bence global değerlere baktım ama o da olmuyor. Enazından daha derli toplu birşekilde yazmamız gerek
Mysql ile bir çözümü olabilir diye düşünüyorum açıkcası mysql im biraz kıt. Tek sorguda 3 farklı row getirebilirsek o da yeter :D Gerçi multiple rows olayı var ona bi bakıyım.
Bir de Jade ile ilgili tavsiyen nedir hocam hangine engine?
-
pSkpt bunu yazdı
Node.js falan bilmem ama iç içe fonksiyonu şu şekilde yapabilirsin gibi geldi bana.
function runQuery(query_arr,sira){ connection.query(query_arr[sira]){ if(err) throw err; var sonuc1 = rows; sonuclar.append(rows); runQuery(query_arr, sira+1) }); } sonuclar = [] query_arr = ["aaa","bbbb", "ccc", "ddd", "eee"] runQuery(query_arr, 0); console.log(sonuclar);java
hocam kesin konuşmayımda burdada runQuery çalışmaya başladığında bitmesini beklemeden console.log'a geçebilir denemedim mysql filan yok konuyu açan arkadaş denese daha iyi olabilir.
@by_Tet hocam http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js şuraya bi bakarsın
detCode tarafından 27/Haz/15 00:46 tarihinde düzenlenmiştir -
detCode bunu yazdıpSkpt bunu yazdı
Node.js falan bilmem ama iç içe fonksiyonu şu şekilde yapabilirsin gibi geldi bana.
function runQuery(query_arr,sira){ connection.query(query_arr[sira]){ if(err) throw err; var sonuc1 = rows; sonuclar.append(rows); runQuery(query_arr, sira+1) }); } sonuclar = [] query_arr = ["aaa","bbbb", "ccc", "ddd", "eee"] runQuery(query_arr, 0); console.log(sonuclar);java
hocam kesin konuşmayımda burdada runQuery çalışmaya başladığında bitmesini beklemeden console.log'a geçebilir denemedim mysql filan yok konuyu açan arkadaş denese daha iyi olabilir.
Deniyorum hocam ama muhtemelen dediğin gibi sonuclar.append de tıpkı sonuclar = rows gibi çalışmayacak. Denedikten sonra yazacaktım @pSkpt
-
O zaman böyle olacak.
function runQuery(query_arr,sira){ connection.query(query_arr[sira]){ if(err) throw err; var sonuc1 = rows; sonuclar.append(rows); if (query_arr.length <= sira+1){ console.log(sonuclar); }else{ runQuery(query_arr, sira+1); } }); } sonuclar = [] query_arr = ["aaa","bbbb", "ccc", "ddd", "eee"] runQuery(query_arr, 0);
-
pSkpt bunu yazdı
O zaman böyle olacak.
function runQuery(query_arr,sira){ connection.query(query_arr[sira]){ if(err) throw err; var sonuc1 = rows; sonuclar.append(rows); if (query_arr.length <= sira+1){ console.log(sonuclar); }else{ runQuery(query_arr, sira+1); } }); } sonuclar = [] query_arr = ["aaa","bbbb", "ccc", "ddd", "eee"] runQuery(query_arr, 0);
aynen hocam :D biraz önceki gibi yapmak için de bi tane callback değişkeni filan oluşturmak gerekiyor şurdaki ilk cevapda elemanın anlattığı gibi http://stackoverflow.com/questions/19739755/nodejs-callbacks-simple-example veya https://github.com/caolan/async şurdaki kütüphaneyle filanda yapabilirsin
mysql sql node.js performance optimization performans optimizasyonu