+-

我有一个简单的邀请表:
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,并且不使用invitee_inviter_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`)
)
这是我的exlain结果:
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
最佳答案
你只需要在表中获得足够的行. MySQL将对小型表进行全表扫描,因为它足够便宜.
我的例子将65k行放入表中,它将使用索引.
http://sqlfiddle.com/#!2/63079/1
点击查看更多相关文章
转载注明原文:mysql – OR运算符不使用索引 - 乐贴网