MYSQL Optimize (3) Tablo Sorgusu Katıl

3 Cevap php

Running an EXPLAIN on some of my query tests have resulted in slow ALL joins even with indexes.
How do I make a MYSQL query with the following information more efficient?

Tables

counter: id (pk), timestamp, user_id (fk)
user: id (PK), username, website_id (fk)
website: id (pk), sitename

SELECT t2.username, t3.sitename, count(*) as views FROM counter t1
LEFT JOIN user t2 ON t2.id = t1.user_id
LEFT JOIN website t3 ON t3.id = t2.website_id
WHERE t1.id <> ""
GROUP BY t1.id
ORDER BY t1.id DESC 

Bir html tablo sonucu:

Kullanıcı adınızı, sitename, counter_views

3 Cevap

Veri henüz doldurulur? Bu tablo boş, ya da çok küçük ise bütün tablo tek bir sayfada, çünkü iyileştirici bir 'bütün' sorgusu seçerek olabilir. Bütün tablo almak için diskten bir sayfa yük endeksi için diskte bir sayfa isabet daha hızlı ve gerçek veri sayfası için daha sonra başka bir sayfa olduğunu.

count(*) yerine kullanmayın count(t1.id)

Question Edit Change

Soru düzenleme ile, saymak istediğiniz ne sayımı tablosunda, örneğin bir sütun adını koymak gerekir count(user.id)

Ben sql yanlış olduğuna inanıyorum. Bunu istemiyorum:

select u.username, s.sitename, count(c.id)
from user u
join website s on u.website_id = s.id
join counter c on u.id = c.user_id
where u.id <> ""
group by u.username, s.sitename
order by u.id desc

Sizin sorgu yanlış görünüyor. Ben böyle bir şey kullanmak istiyorsunuz:

SELECT u.username, w.sitename, c.views
FROM (
  SELECT user_id, COUNT(*) AS views FROM counter GROUP BY user_id
) AS c
LEFT JOIN user u ON u.id = c.user_id
LEFT JOIN website w ON w.id = u.website_id
ORDER BY c.views DESC

Ben de counter.user_id endeksini eklersiniz.