Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Suche performanterer Lösung

3 views
Skip to first unread message

Matthias Esken

unread,
Feb 26, 2006, 3:58:00 AM2/26/06
to
On Sun, 26 Feb 2006 01:17:31 +0100, Stefan Gläßer wrote:

> Die Anzahl benötige ich, um mir daraus dann eine Seitennavigation zu
> basteln. Beide Abfragen sind leider nicht sonderlich performant, da die
> zurückgelieferten Ergebnismengen relativ groß sind (ca. 300.000 Datensätze).
>
> Grenze ich die Abfragen mit Limit ein, geht es rasend schnell. Gibt es
> eine Möglichkeit, trotzdem die betroffenen Gesamt-Datensätze
> herauszufinden? [MySQL 5]

Verwende SQL_CALC_FOUND_ROWS in der Abfrage mit dem LIMIT und rufe
anschließend SELECT FOUND_ROWS() auf. Die Dokumentation mit der exakten
Syntax findest du unter http://dev.mysql.com/doc/refman/5.0/en/select.html.

Ich würde dich zudem bitten, das nächste Mal einen Moment länger darüber
nachzudenken, in welche Gruppe dein Posting passt. Dies hier war eindeutig
eine Frage für de.comp.datenbanken.mysql und selbst wenn du noch irgendwie
PHP-Bezug gesehen haben solltest, dann wäre de.comp.lang.php.datenbanken
korrekt gewesen statt de.comp.lang.php.misc.

XPost & fup2 dcdm

Gruß,
Matthias

Stefan Gläßer

unread,
Feb 26, 2006, 4:23:44 PM2/26/06
to
Hallo Matthias,

> Verwende SQL_CALC_FOUND_ROWS in der Abfrage mit dem LIMIT und rufe
> anschließend SELECT FOUND_ROWS() auf. Die Dokumentation mit der exakten
> Syntax findest du unter http://dev.mysql.com/doc/refman/5.0/en/select.html.

Danke! Das geht jetzt noch schneller.

> Ich würde dich zudem bitten, das nächste Mal einen Moment länger darüber
> nachzudenken, in welche Gruppe dein Posting passt. Dies hier war eindeutig
> eine Frage für de.comp.datenbanken.mysql und selbst wenn du noch irgendwie
> PHP-Bezug gesehen haben solltest, dann wäre de.comp.lang.php.datenbanken
> korrekt gewesen statt de.comp.lang.php.misc.

Werd mir das nächste Mal mehr Mühe geben.

Gruß,
Stefan

Stephan Schuster

unread,
Feb 28, 2006, 7:12:01 AM2/28/06
to
Am Sun, 26 Feb 2006 09:58:00 +0100, schrieb Matthias Esken :

>> Die Anzahl benötige ich, um mir daraus dann eine Seitennavigation zu
>> basteln. Beide Abfragen sind leider nicht sonderlich performant, da die
>> zurückgelieferten Ergebnismengen relativ groß sind (ca. 300.000 Datensätze).
>>
>> Grenze ich die Abfragen mit Limit ein, geht es rasend schnell. Gibt es
>> eine Möglichkeit, trotzdem die betroffenen Gesamt-Datensätze
>> herauszufinden? [MySQL 5]
>
>Verwende SQL_CALC_FOUND_ROWS in der Abfrage mit dem LIMIT und rufe
>anschließend SELECT FOUND_ROWS() auf. Die Dokumentation mit der exakten
>Syntax findest du unter http://dev.mysql.com/doc/refman/5.0/en/select.html.

Hallo

ich habe da ein ähnlich gelagertes Problem,
verwendete Datenbank: MySQL 4.0.18 unter Linux

ich benötige die Datensätze vor einem bestimmten (variablen) Datum
absteigend sortiert:

SELECT [felder]
FROM tb
WHERE dat < 20060228235959
ORDER BY dat DESC
LIMIT 0,50

Wie der OP benötige ich die Anzahl der Datensätze für die Navigation:

SELECT count(*) AS cnt
FROM tb
WHERE dat < 20060228235959

Die Abfrage der Anzahl der Datensätze benötigt (je nach Last) zwischen 0,5
und 4 Sekunden, was eindeutig zu lange ist, die Abfrage der Datensätze um
die 0,05 Sekunden.

Die Tabelle hat ca. 210.000 Einträge (pro Tag kommen etwa 2000 Einträge
hinzu), das Feld dat ist vom Typ datetime und mit einem Index versehen.
Kardinalität ist gleich der Anzahl der Datensätze.

Der Index wird bei der Abfrage laut EXPLAIN auch verwendet:

|+-------+-------+---------------+------+---------+------+--------+--------------------------+
|| table | type | possible_keys | key | key_len | ref | rows | Extra |
|+-------+-------+---------------+------+---------+------+--------+--------------------------+
|| tb | range | dat | dat | 9 | NULL | 208097 | Using where; Using index |
|+-------+-------+---------------+------+---------+------+--------+--------------------------+

Die Verwendung von SQL_CALC_FOUND_ROWS hat keinen Geschwindigkeitsvorteil
gebracht.

Kennt jemand eine Möglichkeit die Performance hier noch zu steigern?

TIA
stephan

0 new messages