2013-08-08 16 views
5

Ich verwende diese Tabelle (MySQL/Motor: MyISAM):Warum wird GROUP BY auf FULLTEXT INDEX temporär verwendet?

CREATE TABLE `activities` (
    `id_activity` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `id_doc` int(10) unsigned NOT NULL DEFAULT '0', 
    `node_id` tinytext NOT NULL, 
    `title` tinytext NOT NULL, 
    `name` tinytext NOT NULL, 
    `keywords` tinytext NOT NULL, 
    `page_type` tinytext NOT NULL, 
    `page_screen_id` tinytext NOT NULL, 
    `page_screen_question` tinytext NOT NULL, 
    PRIMARY KEY (`id_activity`), 
    KEY `name` (`name`(255)), 
    FULLTEXT KEY `node_id` (`node_id`,`title`,`name`,`keywords`,`page_type`,`page_screen_id`,`page_screen_question`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

(Es gibt etwa 100.000 Zeilen)

Hier ist meine Frage:

EXPLAIN SELECT 1 
FROM `activities` 
GROUP BY `node_id`, `title`, `name`, `keywords`, `page_type`, `page_screen_id`, `page_screen_question`; 
  • id: 1
  • select_type: SIMPLE
  • tabelle: aktivitäten
  • Typ: ALLE
  • possible_keys: NULL
  • Schlüssel: NULL
  • key_len: NULL
  • ref: NULL
  • Reihen: 613011
  • Extra: Verwendung vorübergehend; Mit filesort

Ich verstehe nicht, warum meine Abfrage vorübergehend verwendet ... und ich weiß nicht, wie dies zu vermeiden ... Danke

+0

['In einigen Fällen ist MySQL in der Lage, viel besser zu machen und die Erstellung von temporären Tabellen durch Verwendung des Indexzugriffs zu vermeiden.]] (Http://dev.mysql.com/doc/refman/5.1/en /group-by-optimization.html) –

+0

@DavidStarkey Ich lese dieses Thema, aber es gibt tatsächlich einen Index auf meine 'GROUP BY'-Klausel –

+0

Gibt es einen Grund temporäre ist ein Problem? –

Antwort

1

Sollte eher ein Kommentar sein, aber es ist besser lesbar diese übrigens:

Bitte führen Sie diese Abfrage

SELECT CONCAT(table_schema, '.', table_name) AS tablename, 
    CONCAT(ROUND(table_rows/1000000, 2), 'M')         rows, 
    CONCAT(ROUND(data_length/(1024 * 1024 * 1024), 2), 'G')     data, 
    CONCAT(ROUND(index_length/(1024 * 1024 * 1024), 2), 'G')     idx, 
    CONCAT(ROUND((data_length + index_length)/(1024 * 1024 * 1024), 2), 'G') total_size, 
    ROUND(index_length/data_length, 2)           idxfrac 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = database() 
AND TABLE_NAME = 'your_table_name' 

und überprüfen Sie, ob Ihre Tabelle oder der Index tatsächlich in den Speicher passt. Wenn es nicht ... du hast die Antwort.

+0

Vielen Dank, es ist ein sehr Rat ! Ich habe versucht, und haben dieses Ergebnis: Tabellenname: elw_e-doceo.activities - \t Reihen: 0,61 m - \t Daten: 0,06 G - idx: 0,06 G - total_size: 0,11 g - \t idxfrac: 0,99 ... Sie sagten: "Überprüfen Sie, ob Ihre Tabelle oder der Index tatsächlich in den Speicher passt". Sprechen Sie über meinen Computerspeicher oder einen Parameter meiner 'my.ini'? –

+0

Schauen Sie in Ihrer Konfigurationsdatei nach. Es kann sein, dass 'key_buffer_size' nicht die richtige Größe hat. Bitte werfen Sie einen Blick auf diesen manuellen Eintrag: http://dev.mysql.com/doc/refman/5.0/en/server-variables.html#sysvar_key_buffer_size – fancyPants

+0

Vielen Dank! Ich habe 'key_buffer_size = 1024M' und ... (schlechte Nachrichten)" Temporary; Using filesort "versucht. Ich verstehe wirklich nicht :(... –