phpbar.de logo

Mailinglisten-Archive

Anzahl und laufzeit einer Abfrage

Anzahl und laufzeit einer Abfrage

Sebastian Mendel lists at sebastianmendel.de
Mit Jun 30 10:19:04 CEST 2004


westwing at gmx.de schrieb:

> Hallo,
> 
> folgende Abfrage ist erstens viel zu langsam und zweitens müsste ich
> noch eine Anzahlabfrage einbauen
> 
> SELECT 
> 	user.*, 
> 	user.username as title, 
> 	user.ip_date as title3 
> FROM user,stats,smsstats 
> WHERE 1=1 
> AND user.id=smsstats.id_user 
> AND user.id=stats.id_user 
> AND ( user.lastname LIKE '%Markus Schmidt%' 
> 	OR user.firstname LIKE '%Markus Schmidt%' 
> 	OR user.company LIKE '%Markus Schmidt%' 
> 	OR user.username LIKE '%Markus Schmidt%' ) 
> GROUP BY user.id 
> ORDER BY user.company,user.lastname,user.firstname 
> LIMIT 0,30
> 
> Der Sinn ist es über 3 Tabellen zu suchen. In der ersten sind Userdaten
> . In der zweiten und dritten sind Log Daten
> 
> Nun wird die Abfrage sehr langsam
> 
> In der USER sind ca. 500 Einträge
> 
> In der STAT ca. 15000
> In der SMSSTAT ca. 5000
> 
> Grade die letzten beiden werden massiv ansteigen.
> 
> Wenn ich jetzt keinen Suchbegriff übergebe wird die Suche schon jetzt
> extrem langsam.
> 
> Zusätzlich muss ich pro User in Tabelle 1 abfragen ob eine bestimmte
> Anzahl Einträge in STAT oder SMSSTAT vorhandne sind . Also eine Auswahl
> nach der Menge. Wie kann ich so was shcnell und performat erstellen ?

du brauchst Indizes auf stats.id_user und smsstats.id_user

auf user.id sollte ja eh ein PK liegen

erstelle einen Volltext-Index auf die Felder in denen du nach dem Namen 
suchst

http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html

     SELECT user.*,
            user.username     AS title,
            user.ip_date      AS title3,
            COUNT(stats.*)    AS count_stats,
            COUNT(smsstats.*) AS count_smsstats
       FROM user
  LEFT JOIN stats
         ON user.id = stats.id_user
  LEFT JOIN smsstats
         ON user.id = smsstats.id_user
      WHERE MATCH (user.lastname,
                   user.firstname,
                   user.company,
                   user.username)
            AGAINST ('Markus Schmidt')
   GROUP BY user.id
     HAVING count_stats > 2
        AND count_smsstats > 2
   ORDER BY user.company,
            user.lastname,
            user.firstname
      LIMIT 0,30


-- 
Sebastian Mendel

www.sebastianmendel.de www.warzonez.de www.tekkno4u.de www.nofetish.com
www.sf.net/projects/phpdatetime        www.sf.net/projects/phptimesheet

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive