Markus Schatz Wrote:
-------------------------------------------------------
> Hier mal ein Beispiel. Die Tabelle ist etwa 500 MB
> groß mit ca. 370.000 Datensätzen. Der Query
> läuft auf anderen MySQL-Servern in unter einer
> Sekunde ab :-)
>
> --- QUERY ---
>
> SELECT a, b, c, d, e, f, g, h, i, j, k, l, m
> FROM test
> WHERE l < 1233912957 AND m = 'ABC'
> GROUP BY f, k
> ORDER BY l DESC
> LIMIT 10
>
> --- EXPLAIN ---
>
> id -> 1
> select_type -> SIMPLE
> table -> test
> type -> ref
> possible_keys -> m
> key -> m
> key_len -> 5
> ref -> const
ok, d.h. es finden Index Lookups über den Index 'm'
statt, die Bedingung "m = 'ABC'" wird also über den
Index aufgelöst
> rows -> 245419
bleibt aber noch die Bedingung "l < 1233912957"
die nicht über einen Index aufgelöst werden kann
und dazu führt das nun alle potentiellen Ergebniszeilen
mit m='ABC' erst einmal an den SQL node übermittelt
werden müssen der dann schaut für welche tatsächlich
"l < 1233912957" gilt. Das dauert natürlich seine Zeit ...
Abhilfe: entweder einen kombinierten Index über (m,l)
oder "engine_condition_pushdown" aktivieren damit die
Datanodes einfache Where-Bedingungen schon lokal ausführen:
http://dev.mysql.com/doc/refman/6.0/en/condition-pushdown-optimization.html
--
Hartmut Holzgraefe, MySQL Regional Support Manager EMEA
Sun Microsystems GmbH, Sonnenallee 1, 85551 Kirchheim-Heimstetten
Amtsgericht Muenchen: HRB161028
Geschaeftsfuehrer: Thomas Schroeder, Wolfgang Engels, Dr. Roland Boemer
Vorsitzender des Aufsichtsrates: Martin Haering