Ich habe drei Tabellen. eine, die Beiträge hält (postadata
), eine, die Tags enthält (tag
) und eine Verknüpfungstabelle (tag_data
) Ich führe eine Abfrage, um alle Beiträge und ihre Tags mit der folgenden Abfrage verkettet zu bekommen.mysql Langsame Abfrage, um Post und Tags
SELECT
postdata.data_id as data_id,
GROUP_CONCAT(DISTINCT(tag.tag_id)) as tag_ids,
GROUP_CONCAT(DISTINCT(tag.tag) ORDER BY tag.tag ASC) as tags
FROM postdata
LEFT JOIN tag_data as tag_data
INNER JOIN tag as tag
ON tag_data.tag_id = tag.tag_id
ON postdata.data_id = tag_Data.data_id
GROUP BY postdata.data_id
LIMIT 1000
Aber es ist sehr, sehr langsam. (ungefähr 20 Sekunden). Im Folgenden wird die erklären, kann ich nicht
1 SIMPLE postdata index NULL source_id 4 NULL 158808 Using index; Using temporary; Using filesort
1 SIMPLE tag_data index PRIMARY PRIMARY 8 NULL 45279 Using index
1 SIMPLE tag eq_ref PRIMARY PRIMARY 4 tag_data.tag_id 1
unten das Problem zu finden scheinen die Postdata-Indizes sind
postdata 0 PRIMARY 1 data_id A 120405 NULL NULL BTREE
postdata 1 source_id 1 source_id A 168 NULL NULL BTREE
Ist es ein Problem mit der Abfrage? Gibt es eine Möglichkeit, es effizienter zu schreiben? Oder ist es ein fehlender Index?
UPDATE: Hinzufügen Index Info per jordeu Kommentare
SHOW TABLE STATUS VON [database_name] WHERE Name = 'postdata'
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
postdata InnoDB 10 Compact 158645 43 6832128 0 8421376 4194304 NULL 2012-03-08 09:22:40 NULL NULL utf8_unicode_ci NULL
SHOW VARIABLES LIKE 'key_buffer_size'
key_buffer_size 16777216
Haben Sie versucht, inkrementell Bits davon zu entfernen, um zu sehen, an welchem Punkt es beschleunigt? Ich würde versuchen, ohne die GROUP_CONCAT Zeug und sehen, was für einen Unterschied zum Beispiel macht. –
Meine erste Schätzung ist die 'DISTINCT' im' GROUP_CONCAT'. Was ich denke, ist Per Tag_id und pro Tag wird es die gesamte Tabelle scannen, um sicherzustellen, dass Sie nur die verschiedenen Datensätze haben. Ich schätze, dass da dein Flaschenhals ist. –
Wenn ich die zwei GROUP_CONCAT vollständig auskommentiere, aber die Joins behalten werde, so sieht die Abfrage wie folgt aus: SELECT postdata.data_id als data_id FROM postdata ... 'bleibt so langsam. – applechief