zwelch: query unter mysql 5.0 schnell aber unter 5.1 langsam ...?!

Hallo Forum,

ich beobachte aktuell ein komisches verhalten/Problem. ich habe eine SQL-Abfrage welche unter MySQL 5.0 in 0.1 Sekunden abgearbeitet wird, jedoch unter MySQL 5.1 dauert es sage und schreibe 10 Sekunden. Ich habe das Verhalten jeweils mit der gleichen Datenbank auf verschiedenen Servernn in den beiden Versionen getestet und es ist überall das gleiche Ergebnis zustande gekommen. Woran kann den so etwas liegen, bzw. wie könnte man es beheben?

Hier die Abfrage:

  
set @id_account = 1;  
  
SELECT t.id, t.subject, t.hits, (  
  
SELECT count( p.id ) -1  
FROM elv_board_post p  
WHERE p.id_topic = t.id  
) AS responses, (  
  
SELECT p.date  
FROM elv_board_post p  
WHERE p.id_topic = t.id  
ORDER BY p.date DESC  
LIMIT 1  
) AS last_date, (  
  
SELECT count( w.id_topic )  
FROM elv_board_watch w  
WHERE w.id_topic = t.id  
AND w.id_account = @id_account  
) AS watch, ceil( (  
  
SELECT count( p.id )  
FROM elv_board_post p  
WHERE p.id_topic = t.id ) /25  
) AS last_page  
FROM elv_board_topic t  
ORDER BY (  
  
SELECT p.id  
FROM elv_board_post p  
WHERE p.id_topic = t.id  
ORDER BY p.date DESC  
LIMIT 1  
) DESC  
LIMIT 5  

Viel Zeit wird in der Subquery ORDER BY ([...]) DESC geraubt, aber selbst dann (Also wenn man diese Subquery weg lässt) dauert es mit 0.3 Sekunden zu 0.0002 Sekunden immer noch Verhältnismäßig lange.

Ich hoffe jemand kann mir hierbei helfen.
mfg zwelch

  1. moin,

    ich beobachte aktuell ein komisches verhalten/Problem. ich habe eine SQL-Abfrage welche unter MySQL 5.0 in 0.1 Sekunden abgearbeitet wird, jedoch unter MySQL 5.1 dauert es sage und schreibe 10 Sekunden.

    sind die ausführungspläne und die dateninhalte gleich ?

    Ilja

    1. sind die ausführungspläne und die dateninhalte gleich ?

      Hi, ich bin mir jetzt nicht sicher, was du mit Ausführungspläne meinst, aber die Dateninhalte sind gleich. Die Datenbank wurde 1:1 gespiegelt.

      1. Moin!

        Hi, ich bin mir jetzt nicht sicher, was du mit Ausführungspläne meinst, aber die Dateninhalte sind gleich. Die Datenbank wurde 1:1 gespiegelt.

        Trifft das auch für die Keys zu?

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

      2. moin,

        Hi, ich bin mir jetzt nicht sicher, was du mit Ausführungspläne meinst, aber die Dateninhalte sind gleich. Die Datenbank wurde 1:1 gespiegelt.

        ein ausführungsplan ist quasi eine art "wegkarte", wie das dbms zum ergebnis der gewünschte abfrage kommt, welche sich dann grapfisch oder textuell darstellen lassen. unter anderem braucht das dbms dafür statistische werte über die relevanten objekte, wie groß sind die tabellen, welche indexe sind vorhanden, immer wieder vergessen was auch sehr wichtig ist, welche constraints, etc. bei einer umstellung werden oftmals nicht diese informationen mit übertragen, dadurch können sich die ausführungspläne ändern. es kann aber auch sein, dass einfach bestimmte indexe oder andere objekte der datenbank nicht mit übertragen wurden. deswegen meine erster tipp mal beide ausführungsspläne miteinander zu vergleichen.

        Ilja

        1. Es gibt in der Tat Unterschiede ... bei der Server laufen mit der Standard-Konfiguration. Alle Keys und Indezes sollten soweit ich gesehen habe gleich sein.

          MySQL 5.0
          +----+--------------------+-------+--------+---------------+----------+---------+------------------+------+-----------------------------+
          | id | select_type        | table | type   | possible_keys | key      | key_len | ref              | rows | Extra                       |
          +----+--------------------+-------+--------+---------------+----------+---------+------------------+------+-----------------------------+
          |  1 | PRIMARY            | t     | ALL    | NULL          | NULL     | NULL    | NULL             |  324 | Using filesort              |
          |  6 | DEPENDENT SUBQUERY | p     | ref    | id_topic      | id_topic | 4       | elvzw.t.id       |   38 | Using where; Using filesort |
          |  5 | DEPENDENT SUBQUERY | p     | ref    | id_topic      | id_topic | 4       | elvzw.t.id       |   38 |                             |
          |  4 | DEPENDENT SUBQUERY | w     | eq_ref | PRIMARY       | PRIMARY  | 8       | elvzw.t.id,const |    1 | Using where; Using index    |
          |  3 | DEPENDENT SUBQUERY | p     | ref    | id_topic      | id_topic | 4       | elvzw.t.id       |   38 | Using where; Using filesort |
          |  2 | DEPENDENT SUBQUERY | p     | ref    | id_topic      | id_topic | 4       | elvzw.t.id       |   38 |                             |
          +----+--------------------+-------+--------+---------------+----------+---------+------------------+------+-----------------------------+

          MySQL 5.1
          +----+--------------------+-------+--------+---------------+----------+---------+---------------------+------+--------------------------+
          | id | select_type        | table | type   | possible_keys | key      | key_len | ref                 | rows | Extra                    |
          +----+--------------------+-------+--------+---------------+----------+---------+---------------------+------+--------------------------+
          |  1 | PRIMARY            | t     | ALL    | NULL          | NULL     | NULL    | NULL                |  324 | Using filesort           |
          |  6 | DEPENDENT SUBQUERY | p     | index  | id_topic      | date     | 4       | NULL                |    1 | Using where              |
          |  5 | DEPENDENT SUBQUERY | p     | ref    | id_topic      | id_topic | 4       | d00e2dfb.t.id       |   38 |                          |
          |  4 | DEPENDENT SUBQUERY | w     | eq_ref | PRIMARY       | PRIMARY  | 8       | d00e2dfb.t.id,const |    1 | Using where; Using index |
          |  3 | DEPENDENT SUBQUERY | p     | index  | id_topic      | date     | 4       | NULL                |    1 | Using where              |
          |  2 | DEPENDENT SUBQUERY | p     | ref    | id_topic      | id_topic | 4       | d00e2dfb.t.id       |   38 |                          |
          +----+--------------------+-------+--------+---------------+----------+---------+---------------------+------+--------------------------+

          Das sagt mir allerdings nicht viel ;) Und was ich jetzt zu tun habe ist mir auch nicht klar.

          zwelch

          1. moin,

            ich muss bei mysql immer alles unter vorbehalt sagen, komme aus der Oracle welt. aber ich würde als ersten schritt erst einmal die gesamt neu aufgesetzt datenbank neu analysieren lassen, sprich frische statistiken erzeugen. du siehst alleine schon in der spalte "rows" (die anzahl der datensätze), dass es dort unterschiede gibt. und das kann eigentlich nicht sein, wenn es wirklich eine 1:1 spiegelung ist, dann sollte auch die anzahl der datensätze gleich sein. und nachdem du frische statistiken hats, vergleich noch mal die ausführungspläne. grundsätzlich kann es bei unterschiedlichen versionen aber auch immer zu anderen ausführungsplänen kommen. muss man eben schauen.

            Ilja