2012-01-20 45 views
5

Sitemde çevrimiçi olan kullanıcıları takip etmem gerekiyor, böylece çevrimiçi olan kullanıcıların avatarlarının yanında "çevrimiçi" simgesi gösterebiliyorum.Bu şekilde yaptığımda MySQL sorgum neden bu kadar hızlı ve neden bu kadar yavaş?

UPDATE `users` 
SET `last_seen` = CURRENT_TIMESTAMP 
WHERE `user_id` = '$user_id' 

Şimdi hemen bundan sonra, ben yürütün:

bu tespit ilk adım yüzden bir güncelleştirme sorgusu kullanıcı sayfasını her yapıyorum kullanıcı son ne zaman görüldüğünü takip etmektir Ben ana sayfasında bunları görüntüleyebilir, böylece başka bir sorgu, bu bir kesin kriter altında sitemin tüm kullanıcıları alır:

SELECT *, 
(ACOS(SIN(0.7103989219783) * SIN(RADIANS(users.latitude)) + COS(0.7103989219783) * COS(RADIANS(users.latitude)) * COS(RADIANS(users.longitude) - -1.2894447135174)) * 6371) AS SearchRadius 
FROM `users` 
INNER JOIN `profiles` ON (
    users.user_id = profiles.user_id 
) 
WHERE (users.latitude > 38.904216788163 AND users.latitude < 42.501503211837) 
AND (users.longitude > -76.252301637251 AND users.longitude < -71.507178362749) 
AND (ACOS(SIN(0.7103989219783) * SIN(RADIANS(users.latitude)) + COS(0.7103989219783) * COS(RADIANS(users.latitude)) * COS(RADIANS(users.longitude) - -1.2894447135174)) * 6371) < 200 AND users.sex = '1' AND users.seeking = '2' AND users.user_id != '1' AND users.account_status = '1' LIMIT 0, 10 

bu sorgunun delilik Aldırma, temelde nokta aynı users seçerek am olduğunu daha önce güvendiğim tablo ing. Ben birbiri ardına bu 2 sorgular birini çalıştırdığınızda

bu alıyorum zamanlardır:

1st query: 0.0392 seconds 
2nd query: 1.5396 seconds 

Bu sayfa yüklenme süresinde farkedilir bir gecikmeye neden olur.

Şimdi çevrimiçi kullanıcılar için ayrı bir tablo oluştururken ve bu ilk sorgu değiştirin:

UPDATE `online_users` 
SET `last_seen` = CURRENT_TIMESTAMP 
WHERE `user_id` = '$user_id' 

kez bu şekilde değiştirildi:

1st query: 0.0411 seconds 
2nd query: 0.0008 seconds 

ve sayfa yüklendiğinde çok daha hızlı!

Bu neden? Tahminimce masa kilitleme ile ilgili bir şey var ama emin ya da daha fazla bilgi bilmek için yeterli bilmiyorum.

+0

İkinci sorgu hala doğru sonuçları döndürüyor mu? –

+1

Eğer ikinci sorguyu ilk olmadan çalıştırırsanız daha hızlı mı? Bir çeşit G/Ç sorunu olabilir - MySQL içersinde yokum, ama SQL'de engelleme gibi bir şey olmamalı, her şeyden sonra aynı işlemde aynı bağlantıda. Bu durumda, kabul edilmeyen değişiklikleri görmesine izin verilir veya değişiklikler zaten taahhüt edilir. InnoDB veya MyISAM kullanıyor musunuz? –

+0

@Cade Roux Yalnızca 2. sorguyu çalıştırırsam daha hızlıdır, ancak sadece 0.0004'te bir dakika kadardır. MyISAM kullanıyorum. – TK123

cevap

1

SELECT *, last_seen içerdiğinden MySQL sorguyu veya alt sorguları önbelleğe alamaz. Tüm alanların açık bir sayımını deneyebilirsiniz, ancak last_seen. InnoDB'nin masaya

(Ama ayrı bir tablo online_users çok mantıklı.)

+0

sadece last_seen hariç tüm sütun adlarına açık bir çağrıyla denedi ve sorgu süresi hala aynı uzunluktaydı. – TK123

+0

Yani bilgeyiz; Sadece aynı tablonun güncellenmesi, bu tablonun _all_ önbelleğe alınmış sorgu verilerini siler. Ya da tablo başına iş parçacığı tahsisi ve diskin güncelleme geri yüklenmesi gibi belirsiz bir şey. –

-4

sorgu MyISAM üzerinde daha yavaştır. tabloda daha fazla satır sorguyu daha yavaş hale getiriyor. Tablodaki yanlış indeksleme işlemi sorgulamayı daha yavaş hale getiriyor, EXPLAIN komutuyla kontrol edin.

0

SELECT sorguyu testinizden önce birkaç kez çalıştırıyorsanız, büyük olasılıkla sorgu önbelleğinin etkilerini görüyorsunuz. Tablodaki herhangi bir güncelleme önbelleği geçersiz kılacak ve sorguyu tekrar yürütülmeye zorlayacaktır. Farklı bir tabloyu güncelleyerek, bu önbellek girdilerini gizlemekten kaçınırsınız.

+0

bu mantıklı, ancak benim durumumda bu sorguyu yalnızca bir kez yürütüyorum ve bu da güncelleme sorgusundan sonra. – TK123

+0

Bunu, başka komutları çalıştırmadan önce 'SET SESSION query_cache_type = OFF;' ile onaylayabileceğinizi unutmayın. (Bu sadece geçerli bağlantı için sorgu önbelleğini devre dışı bırakır.) –

İlgili konular