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 | |
+----+-------------+-------+-------+---------------+-------------+---------+-----------+------+--------------------------+