2011-01-11 3 views
2

나는 다음과 같은 테이블이 있습니다의 MySQL EXPLAIN 유형 : ALL 문제

CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`path` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '/', 
PRIMARY KEY (`id`), 
UNIQUE KEY `path` (`path`) 
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
CREATE TABLE `items` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`category_id` int(11) NOT NULL DEFAULT '1', 
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no name', 
PRIMARY KEY (`id`), 
KEY `category_id` (`category_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

그리고 쿼리가 문제이다 :

SELECT c.path, i.name 
FROM categories c 
JOIN items i ON i.category_id = c.id 
WHERE c.path LIKE CONCAT((
SELECT path 
FROM categories ci 
WHERE ci.id =2 
), '/%') 
OR c.id =2 
mysql> EXPLAIN SELECT c.path, i.name FROM categories c JOIN items i ON i.category_id = c.id WHERE c.path LIKE CONCAT(( SELECT path FROM categories ci WHERE ci.id =2), '/%') OR c.id =2 
    -> ; 
     +----+-------------+-------+--------+---------------+---------+---------+--------------------+------+-------------+ 
     | id | select_type | table | type | possible_keys | key  | key_len | ref    | rows | Extra  | 
     +----+-------------+-------+--------+---------------+---------+---------+--------------------+------+-------------+ 
     | 1 | PRIMARY  | i  | ALL | category_id | NULL | NULL | NULL    | 8 |    | 
     | 1 | PRIMARY  | c  | eq_ref | PRIMARY,path | PRIMARY | 4  | tree.i.category_id | 1 | Using where | 
     | 2 | SUBQUERY | ci | const | PRIMARY  | PRIMARY | 4  |     | 1 |    | 
     +----+-------------+-------+--------+---------------+---------+---------+--------------------+------+-------------+ 

'CATEGORY_ID'의 유형은 ALL입니다; ALL을 사용하지 않는 방법은 무엇입니까?

최상의 솔루션이 있습니까?

추가 : 내가

create index idx_id_path on categories(id, path) 

(경로, ID)를 시도 이노

mysql> EXPLAIN SELECT c.path, i.name FROM categories c JOIN items i ON i.category_id = c.id WHERE c.path LIKE CONCAT(( SELECT path FROM categories ci WHERE ci.id =2), '/%') OR c.id =2; 
+----+-------------+-------+-------+---------------+-------------+---------+-----------+------+--------------------------+ 
| id | select_type | table | type | possible_keys | key   | key_len | ref  | rows | Extra     | 
+----+-------------+-------+-------+---------------+-------------+---------+-----------+------+--------------------------+ 
| 1 | PRIMARY  | c  | index | PRIMARY,path | path  | 767  | NULL  | 7 | Using where; Using index | 
| 1 | PRIMARY  | i  | ref | category_id | category_id | 4  | tree.c.id | 1 |       | 
| 2 | SUBQUERY | ci | const | PRIMARY  | PRIMARY  | 4  |   | 1 |       | 
+----+-------------+-------+-------+---------------+-------------+---------+-----------+------+--------------------------+ 

답변

2

에 시도 또는 작동하지 않을 수 있습니다 더 나은

은 종종 MySQL의 전용 테이블 당 하나의 인덱스를 사용 따라서 색인에 추가 열이있는 경우 해당 색인에 올바른 순서로 색인이 올바른 열을 포함하면 색인을 더 잘 사용할 수 있습니다.