phpbar.de logo

Mailinglisten-Archive

Anzahl und laufzeit einer Abfrage

Anzahl und laufzeit einer Abfrage

henry bayer henry_bayer at gmx.de
Son Jun 27 20:16:31 CEST 2004


hej,

>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

performance-nachteile:

a) user.* sollte möglichst vermieden werden, da das parsen auf
mysql-server-seite länger dauert wie wenn du alle spalten angeben würdest.

b) gewichtiger ist jedoch, daß der index nicht benutzt werden kann, weil du
mit LIKE %wert% arbeitest, somit *muss* der gesamte datenbestand geprüft
werden, was kostet. 

c) index prüfen mit EXPLAIN

d) mir scheint das ERD nicht ausgereift bzw. ich verstehe nicht, wie man im
feld firstname mit einem vollen vor - und nachnamen als like_phrase sucht.
ebenso bei lastname oder gar username. von aussen betrachtet, macht das so
keinen sinn. es könnte sinniger sein, weitere tabellen mit in der ERD
einzubeziehen, wo diese daten normalisiert sind und man dann besser mit
suchabfragen arbeiten und den index miteinbeziehen könnte. andererseits kann
die suchphrase im frontend auch gesplittet und dann mit einem wert%-like
gearbeitet werden.

zuguterletzt empfehle ich dir folgende syntax-verbesserung ;-)

SELECT u.wert1, u.wert.2,
       u.username AS title,
       u.ip_date AS title3
FROM user AS u, stats AS s,smsstats AS smss
WHERE 1=1
AND u.id=smss.id_user
AND u.id=s.id_user   
AND ( u.lastname LIKE '%Markus Schmidt%'
        OR u.firstname LIKE '%Markus Schmidt%'
        OR u.company LIKE '%Markus Schmidt%'
        OR u.username LIKE '%Markus Schmidt%' )
GROUP BY u.id  
ORDER BY u.company, u.lastname, u.firstname
LIMIT 0,30

bei performance-fragen empfiehlt sich immer ales erstes:
- SHOW INDEX FROM tbl
- EXPLAIN SELECT ...

dann wirst du sehen, wo der schuh stecken bleibt und das, in diesem fall, da
der gesamte datenbestand mehrfach durchenudelt werden muss.


henry

-- 
"Sie haben neue Mails!" - Die GMX Toolbar informiert Sie beim Surfen!
Jetzt aktivieren unter http://www.gmx.net/info

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


php::bar PHP Wiki   -   Listenarchive