+-
mysql – OR运算符不使用索引
我有一个简单的邀请表:

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运算符不使用索引 - 乐贴网