[vz-dev] SQL Abfrage aktueller Verbrauch sehr langsam

Jakob Hirsch jh at plonk.de
Mon Sep 16 18:06:53 CEST 2013


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).

> den scan macht dann aber die haupt-query, nich die subquery.

Nö, der Haupt-Query selektiert die row direkt über id, aber der subquery
muß alle rows abklappern, bei denen gilt "channel_id LIKE  '14'". Das
LIKE ist komischerweise auch ein Problem, anstatt das zu "channel_id=14"
zu optimieren, konvertiert mysql die channel_id jeder row erstmal zu
einem string (zumindest in der 5.5.31 von wheezy). Ich weiß allerdings
auch nicht, wie man auf die Idee kommt, hier LIKE zu benutzen. Mit einem
"channel_id=14" beschränkt sich die Suche immerhin nur auf die Rows
dieses channels, ist aber natürlich immer noch sehr ineffizient.

> 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.



More information about the volkszaehler-dev mailing list