【发布时间】:2012-12-03 08:42:14
【问题描述】:
我有一个简单的邀请表:
CREATE TABLE `invitation` (
`invitation_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`inviter_id` int(10) unsigned NOT NULL,
`invitee_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`invitation_id`),
UNIQUE KEY `invitee_inviter_idx` (`invitee_id`,`inviter_id`)
)
我想选择邀请人 70 对被邀请人 62 的邀请,反之亦然:
EXPLAIN SELECT * FROM `invitation` WHERE
(invitee_id = 70 AND inviter_id = 62) OR (invitee_id = 62 AND inviter_id = 70)
但是这个查询是 ALL 类型的并且不使用被邀请人_邀请人_idx。 请告诉我这里出了什么问题?
谢谢!
==编辑== 抱歉,我对架构有误,它还有一个字段:request_ts。这次查询计划是 ALL。
CREATE TABLE `invitation` (
`invitation_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`inviter_id` int(10) unsigned NOT NULL,
`invitee_id` int(10) unsigned NOT NULL,
`request_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`invitation_id`),
UNIQUE KEY `invitee_inviter_idx` (`invitee_id`,`inviter_id`)
)
这是我的解释结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE invitation ALL invitee_inviter_idx \N \N \N 1 Using where
【问题讨论】:
-
表中有多少条记录?如果表非常小,那么查询优化器可能会决定进行全面扫描,因为这样做非常便宜。
-
我认为你只在某些情况下才能为 MyISAM 表获得它;即当您在“额外”列中看到“在阅读 const 表后注意到的不可能的地方”时
-
@Salman A,对不起,我错了,我更新了架构。
-
我用空表输入 ALL :( 我使用的是 mysql v5.5.23
-
用一些数据填充你的表并发布
EXPLAIN的完整结果。