2012-07-12 2 views
0

어떤 도움을 주시면 감사하겠습니다.두 테이블을 결합 할 때 인덱스를 사용하는 MySQL

나는 2 개 테이블이 있습니다

CREATE TABLE `users` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `username` varchar(255) NOT NULL, 
    `username_canonical` varchar(255) NOT NULL, 
    `email` varchar(255) NOT NULL, 
    `email_canonical` varchar(255) NOT NULL, 
    `enabled` tinyint(1) NOT NULL, 
    `salt` varchar(255) NOT NULL, 
    `password` varchar(255) NOT NULL, 
    `last_login` datetime DEFAULT NULL, 
    `locked` tinyint(1) NOT NULL, 
    `expired` tinyint(1) NOT NULL, 
    `expires_at` datetime DEFAULT NULL, 
    `confirmation_token` varchar(255) DEFAULT NULL, 
    `password_requested_at` datetime DEFAULT NULL, 
    `roles` longtext NOT NULL COMMENT '(DC2Type:array)', 
    `credentials_expired` tinyint(1) NOT NULL, 
    `credentials_expire_at` datetime DEFAULT NULL, 
    `messages_unread_count` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UNIQ_1483A5E992FC23A8` (`username_canonical`), 
    UNIQUE KEY `UNIQ_1483A5E9A0D96FBF` (`email_canonical`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 

CREATE TABLE `blog_posts` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`user_id` bigint(20) DEFAULT NULL, 
`category_id` int(11) DEFAULT NULL, 
`title` varchar(255) NOT NULL, 
`content` longtext NOT NULL, 
`tags` varchar(512) NOT NULL, 
`timestamp_created` datetime NOT NULL, 
`timestamp_updated` datetime NOT NULL, 
`is_visible` tinyint(1) NOT NULL, 
`is_deleted` tinyint(1) NOT NULL, 
PRIMARY KEY (`id`), 
KEY `IDX_78B2F93212469DE2` (`category_id`), 
KEY `IDX_78B2F932A76ED395` (`user_id`), 
CONSTRAINT `FK_78B2F932A76ED395` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), 
CONSTRAINT `FK_78B2F93212469DE2` FOREIGN KEY (`category_id`) REFERENCES `blog_categories`  (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 

을 나는, 게시물 작성자와 출력을 제한하는 모든 게시물을 선택하여 나에게 조언을주고 싶어 - I가 쿼리를 강제 수있는 방법을 사용 인덱스 :

select p.*, u.* from blog_posts p join users u on p.user_id = u.id limit 0,10; 

출력 설명 :

,536,913,632 10
+----+-------------+-------+------+----------------------+----------------------+---------+----------+------+-------------+ 
| id | select_type | table | type | possible_keys  | key     | key_len | ref  | rows | Extra  | 
+----+-------------+-------+------+----------------------+----------------------+---------+----------+------+-------------+ 
| 1 | SIMPLE  | u  | ALL | PRIMARY    | NULL     | NULL | NULL  | 1 |    | 
| 1 | SIMPLE  | p  | ref | IDX_78B2F932A76ED395 | IDX_78B2F932A76ED395 | 9  | sky.u.id | 1 | Using where | 
+----+-------------+-------+------+----------------------+----------------------+---------+----------+------+-------------+ 

사용자 테이블에 가입 할 때 인덱스를 사용할 수있는 방법이 있습니까?

+0

는 당신이 인덱스를 사용하는 힘을 뜻을 ?? 당신의 쿼리는 이미 인덱스를 사용하고 있습니다. 인덱스 타입이 무엇인지 선택할 수 있고 어떤 컬럼에서 – jcho360

+0

은 포스트 테이블에 인덱스를 사용하지만 사용자를 사용하지 않거나 오해하고 있습니까? – vta

답변

0

blogposts.userid와 users.id 사이에 FK 관계를 설정하면 MySQL이 색인을 자동으로 사용합니다.

는 그래서 FK 관계를 만들 :

CONSTRAINT blogposts_userid FOREIGN KEY (user_id) REFERENCES users (id) 
+0

나는 하나있다 : CONSTRAINT'FK_78B2F932A76ED395' FOREIGN KEY ('user_id') 참고'users' ('id') – vta

관련 문제