[vz-dev] SQL Abfrage aktueller Verbrauch sehr langsam

Thorben Thuermer r00t at constancy.org
Tue Sep 17 21:02:23 CEST 2013


On Mon, 16 Sep 2013 18:06:53 +0200 Jakob Hirsch <jh at plonk.de> wrote:
> Thorben Thuermer, 2013-09-16 16:19:
> >>> $result1=mysql_query("SELECT value FROM data WHERE id = (select max(id)
> >>> FROM data WHERE channel_id LIKE  '14')");
> >> ...
> >>> Diese Anfrage dauert ca. 6-7 Sekunden. Hat jemand eine Idee wie man
> >>> dieses beschleunigen kann?
> >>
> >> Der subquery macht einen table-scan über die komplette data-Tabelle, was
> >> dauert natürlich entsprechend lange.
> >
> > achso, es gibt keinen index auf `id`...
> 
> Doch, natürlich, das ist sogar der PRIMARY KEY. Das bringt aber nix,
> weil es keinen kombinierten key über channel_id und id gibt (wird
> normalerweise auch nicht gebraucht).

ack

[...]
> > wie schon gesagt, man wuerde doch eleganter schreiben:
> > select value from data where channel_id=14 order by timestamp desc limit 1;
> 
> Sieht schöner aus, ist aber wohl nicht so gut:
> > +----+-------------+-------+------+---------------+-------------+---------+-------+---------+-------------+
> > | id | select_type | table | type | possible_keys | key         | key_len | ref   | rows    | Extra       |
> > +----+-------------+-------+------+---------------+-------------+---------+-------+---------+-------------+
> > |  1 | SIMPLE      | data  | ref  | chan_ts_idx   | chan_ts_idx | 5       | const | 1015040 | Using where |
> > +----+-------------+-------+------+---------------+-------------+---------+-------+---------+-------------+
> 
> Der Query ist allerdings sehr schnell, das stimmt schon.

die art von query ist halt 1:1 auf den vorhandenen index abzubilden,
der die daten nach channel und dann timestamp sortiert enthaelt,
so dass ein einfacher lookup daraus wird.
k.A. was mysql da mit "rows 1015040" und "using where" sagen will...

- Thorben


More information about the volkszaehler-dev mailing list