2013-08-08 27 views
5

Tôi đang sử dụng bảng này (MySQL/Động cơ: MyISAM):Tại sao GROUP BY trên INDEX INDEX được sử dụng tạm thời?

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; 

(Có khoảng 100000 hàng)

Đây là câu hỏi của tôi:

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
  • bảng: hoạt động
  • loại: TẤT CẢ
  • possible_keys: NULL
  • chính: NULL
  • key_len: NULL
  • ref: NULL
  • hàng: 613011
  • Extra: Sử dụng tạm thời; Sử dụng filesort

Tôi không hiểu tại sao truy vấn của tôi sử dụng tạm thời ... và tôi không biết làm thế nào để tránh điều này ... Cảm ơn

+0

['Trong một số trường hợp, MySQL có thể làm tốt hơn nhiều và tránh tạo bảng tạm thời bằng cách sử dụng truy cập chỉ mục.'] (http://dev.mysql.com/doc/refman/5.1/vi /group-by-optimization.html) –

+0

@DavidStarkey Tôi đã đọc chủ đề này, nhưng thực sự có một chỉ mục trên mệnh đề 'GROUP BY' của tôi –

+0

Có lý do tạm thời nào là vấn đề không? –

Trả lời

1

khá nên được một lời nhận xét, nhưng nó dễ đọc hơn này cách:

Vui lòng thực hiện truy vấn này

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' 

và kiểm tra xem bảng của bạn hoặc chỉ số thực sự phù hợp với bộ nhớ. Nếu nó không ... bạn có câu trả lời.

+0

Cảm ơn rất nhiều, nó rất khuyên bảo ! Tôi đã thử và có kết quả này: tablename: elw_e-doceo.activities - \t hàng: 0.61M - \t dữ liệu: 0.06G - idx: 0.06G - TOTAL_SIZE: 0.11G - \t idxfrac: 0,99 ... Bạn đã nói: "hãy kiểm tra xem bảng hoặc chỉ mục của bạn có thực sự đưa vào bộ nhớ" hay không. Bạn đang nói về bộ nhớ máy tính của tôi hoặc một param của 'my.ini' của tôi? –

+0

Có một cái nhìn trong tập tin cấu hình của bạn. Có thể là 'key_buffer_size' không đúng kích cỡ. Vui lòng xem hướng dẫn sử dụng này: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_key_buffer_size – fancyPants

+0

Cảm ơn! Tôi đã thử 'key_buffer_size = 1024M' và ... (tin xấu)" Sử dụng tạm thời; Sử dụng filesort ". Tôi thực sự không hiểu :(... –