2013-08-08 3 views
5

Używam tej tabeli (MySQL/Silnik: MyISAM):Dlaczego GROUP BY na FULLTEXT INDEX jest tymczasowy?

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; 

(istnieje około 100 tysięcy wierszy)

Oto moje zapytanie:

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
  • tabela: działalność
  • typ: WSZYSTKIE
  • possible_keys: NULL
  • klucz: NULL
  • key_len: NULL
  • Ref: NULL
  • rzędy: 613011
  • Extra: Korzystanie tymczasowe; Korzystanie filesort

Nie rozumiem, dlaczego moje zapytanie wykorzystuje tymczasowy ... a ja nie wiem jak tego uniknąć ... Dzięki

+0

["W niektórych przypadkach MySQL jest w stanie zrobić znacznie lepiej i uniknąć tworzenia tabel tymczasowych za pomocą dostępu do indeksu."] (Http://dev.mysql.com/doc/refman/5.1/en /group-by-optimization.html) –

+0

@DavidStarkey Czytałem ten temat, ale jest rzeczywiście indeks na moim 'GROUP BY' klauzula –

+0

Czy istnieje jakiś powód tymczasowy jest problem? –

Odpowiedz

1

powinno być raczej komentarz, ale jest to bardziej czytelne sposób:

proszę wykonać to zapytanie

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' 

i sprawdzić, czy tabela lub indeks faktycznie pasuje do pamięci. Jeśli to nie ... masz odpowiedź.

+0

Wielkie dzięki, to bardzo Rada ! Próbowałem i mieć ten wynik: nazwa_tabeli: elw_e-doceo.activities - \t rzędów: 0.61M - \t Dane: 0,06 g - idx: 0,06 g - TOTAL_SIZE: 0,11 g - \t idxfrac: 0,99 ... Powiedziałeś: "sprawdź, czy tabela lub indeks faktycznie mieści się w pamięci". Czy mówisz o mojej pamięci komputera lub o parametrze "my.ini"? –

+0

Zajrzyj do pliku konfiguracyjnego. Możliwe, że 'key_buffer_size' ma niewłaściwy rozmiar. Proszę spojrzeć na ten manualny wpis: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_key_buffer_size – fancyPants

+0

Dzięki! Próbowałem 'key_buffer_size = 1024M' i ... (złe wieści)" Używanie tymczasowego; Używanie filesort ". Naprawdę nie rozumiem :(... –