2012-07-12 49 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 

,我想選擇所有崗位限制與帖子的作者的輸出,給我一個建議 - 我怎麼能強迫查詢使用索引:

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

Explain輸出:

+----+-------------+-------+------+----------------------+----------------------+---------+----------+------+-------------+ 
| 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 2012-07-12 20:29:51

+0

它在帖子表上使用索引,但是沒有在用戶上使用索引,或者我誤解了某些內容? – vta 2012-07-12 20:36:30

回答

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')REFERENCES'users'('id') – vta 2012-07-12 20:41:26