php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.02.2008, 16:46  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard [gelöst] SELECT COUNT(*) FROM SUBSELECT braucht ewig!

Hallo,

ich habe einen Query der von PHP erstellt wird und z.B. folgt aussieht:
Code:
SELECT k.ident, k.vorname, k.nachname
    FROM kundenstamm_kunden k
    INNER JOIN kundenstamm_kat_to_kunde i1
      ON i1.zukunde=k.ident
    INNER JOIN kundenstamm_kategorien j1
      ON j1.ident=i1.zukat
    WHERE ((j1.fulllang LIKE '%KU-2000%') OR (j1.fullshort LIKE '%KU-2000%'))
    GROUP BY k.ident;
Wenn ich diesen Query ausführe dauert das derzeit ca. 0.15 Sekunden.

Jetzt muss ich feststellen wie viele Einträge das es gibt. Da ich mit GROUP BY arbeite kann ich nicht einfach COUNT(Ü) machen, sondern muss das in einen Sub-Select machen.

Sieht dann folgt aus:
Code:
SELECT COUNT(*) AS anzahl
  FROM kundenstamm_kunden a
  WHERE a.ident IN
  (SELECT k.ident
    FROM kundenstamm_kunden k
    INNER JOIN kundenstamm_kat_to_kunde i1
      ON i1.zukunde=k.ident
    INNER JOIN kundenstamm_kategorien j1
      ON j1.ident=i1.zukat
    WHERE ((j1.fulllang LIKE '%KU-2000%') OR (j1.fullshort LIKE '%KU-2000%'))
    GROUP BY k.ident
  );
Also die gleiche Abfrage (0.15 Sekunden), nur das alle Einträge gezählt werden sollen.
Diese Abfrage dauert ca. 3 Minuten(!).

Kann mir jemand erklären, wieso das so lange dauert? Wie kann ich das Problem lösen?

Ich habe derzeit MySQL 4.1.13-Max auf Linux Suse 10.0
Ich habe den Query nicht über PHP ausführen lassen (da die Execution-Time bei 3 Minuten nicht reicht), sondern direkt im MySQL über die Konsole.
Ca. 2000 Datensätze in kundenstamm_kunden, ca. 2500 Einträge in kundenstamm_kat_to_kunde und ca. 8000 Einträge in kundenstamm_kategorien.
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 22.02.2008, 11:38  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Versuchs mal hiermit:

Code:
SELECT COUNT(id) AS anzahl
  FROM (SELECT k.ident AS id
    FROM kundenstamm_kunden k
    INNER JOIN kundenstamm_kat_to_kunde i1
      ON i1.zukunde=k.ident
    INNER JOIN kundenstamm_kategorien j1
      ON j1.ident=i1.zukat
    WHERE ((j1.fulllang LIKE '%KU-2000%') OR (j1.fullshort LIKE '%KU-2000%'))
    GROUP BY k.ident
  ) as tmp;
cycap ist offline   Mit Zitat antworten
Alt 22.02.2008, 12:59  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Solltest auf jeden Fall Indexe auf die Verknüpfungs- und Bedingungsspalten legen.
Zergling-new ist offline   Mit Zitat antworten
Alt 25.02.2008, 08:44  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

@Zergerling:
Ich habe mir den Query mit EXPLAIN erklären lassen und er hat mir überall schnelle Verknüpfungen angezeigt.
Code:
+----+--------------------+-------+--------+---------------+---------+---------+------------------------------+------+--------------------------+
| id | select_type        | table | type   | possible_keys | key     | key_len | ref                          | rows | Extra                    |
+----+--------------------+-------+--------+---------------+---------+---------+------------------------------+------+--------------------------+
|  1 | PRIMARY            | a     | index  | NULL          | PRIMARY |       8 | NULL                         | 1285 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | k     | index  | PRIMARY       | PRIMARY |       8 | NULL                         | 1285 | Using index              |
|  2 | DEPENDENT SUBQUERY | i1    | ref    | zukat,zukunde | zukunde |       8 | ao_amj-musik_de_www.k.ident  |   14 | Using where              |
|  2 | DEPENDENT SUBQUERY | j1    | eq_ref | PRIMARY       | PRIMARY |       8 | ao_amj-musik_de_www.i1.zukat |    1 | Using where              |
+----+--------------------+-------+--------+---------------+---------+---------+------------------------------+------+--------------------------+
4 rows in set (0.02 sec)
Ich hatte sogar einen ähnlichen Bug in der Bugliste von MySQL gefunden:
http://bugs.mysql.com/bug.php?id=3904

@cycap:
Damit geht es:
Code:
+--------+
| anzahl |
+--------+
|    331 |
+--------+
1 row in set (0.37 sec)
Danke euch!
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Kein Ergebnis bei SELECT (MySQL 4.1.9) dr.e. Datenbanken 4 15.06.2008 19:54
Probleme mit SELECT max(xyz) FROM... go1denboy Datenbanken 3 14.06.2008 20:06
select count(*) from tabelle mit AND = fehler ... cytrobic Datenbanken 2 27.07.2006 12:40
php-file wird downgeloadet dws Server, Hosting und Workstations 10 19.04.2006 18:45
SELECT FROM WHERE..AND...OR PHP Tipps 2006 4 14.02.2006 09:59
Select * FROM * WHERE ??? PHP Tipps 2005-2 12 07.10.2005 17:45
Select max() From blablabla PHP Tipps 2005-2 8 07.10.2005 09:27
SELECT * FROM 2 Tabellen - Problem Datenbanken 1 01.09.2005 16:30
libmysqlclient.so.10 is needed Datenbanken 11 20.06.2005 15:27
Befehlsoptimierung faux Datenbanken 4 31.05.2005 19:11
SELECT * FROM tabelle WHERE DarkThunder PHP Tipps 2005 10 23.04.2005 21:17
SELECT FROM DB WHERE 2 SACHEN UEBEREINSTIMMEN Datenbanken 3 24.01.2005 15:58
SELECT FROM...WHERE id=(SELECT...) bicpi Datenbanken 4 24.10.2004 10:53
Select FROM tabelle ORDER BY id LIMIT 1,10 funkt nicht richt juhuwoorps Datenbanken 6 12.09.2004 14:02
[Erledigt] select ALLES from EGALWOHER where WASAUCHIMMER Datenbanken 1 01.06.2004 11:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
subselect, select count from select, sql count subselect, mysql subselect count, mysql count subselect, subselect count, subselect from, sql subselect count, count subselect, sql select subselect, sql subquery count, select count subselect, from subselect, select count select, sql select from subselect, select from subselect, select subselect, select count, sub select, sql count join

Alle Zeitangaben in WEZ +2. Es ist jetzt 07:19 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.