Re: Suche performanterer Lösung
am 26.02.2006 09:58:00 von Matthias Esken
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
Re: Suche performanterer Lösung
am 26.02.2006 22:23:44 von stefan.glaesser
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
Re: Suche performanterer Lösung
am 28.02.2006 13:12:01 von stephan.s
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