Langsame Subselects bei großen InnoDB Tabellen in MySQL

Mit Anwendung von Subselects bei InnoDB Tabellen mit mehreren tausend Datensätzen geht die Performance von MySQL massivst in den Keller. Bereits einfache Abfragen können den Datenbankserver zum Erliegen bringen, auch wenn eine Zugriff über Schlüssel oder Indizes erfolgt:

mysql> SELECT `contact_id` FROM `contact` WHERE `contact_id` = 1;
1 row in set (0.00 sec)  -- FAST
mysql> SELECT `contact_id` FROM `contact` WHERE `contact_id` IN 
-> ( SELECT `contact_id` FROM `contact` WHERE `contact_id` = 1 );
1 row in set (20.68 sec) -- SLOW

Der Fehler ist dem Entwicklerteam bereits bekannt und behoben, jedoch mit dem Vermerk “Closed in MySQL 6.0″.

http://bugs.mysql.com/bug.php?id=9021

Die Version 6 von MySQL läßt jedoch auf sich warten und wird in nächster Zeit nicht für den produktiven Einsatz zur Verfügung stehen. Solange könnnen nur Workarounds wie bspw. über JOINs weiterhelfen:

SELECT 
    `contact`.`contact_id` 
FROM 
    `contact` 
INNER JOIN (
    SELECT 
        `contact_id` 
    FROM 
        `contact`
    WHERE 
        `contact_id` = 1
) `subselect`
ON
    `subselect`.`contact_id` = `contact`.`contact_id`
Kategorie: