【发布时间】:2015-04-15 21:23:56
【问题描述】:
我有一个关于获取玩家和他的朋友的非常简单的查询,但它似乎进行了全表扫描,我看不出它的原因。我是否需要将其重写为连接以使其使用索引?玩家表有 7411 行。
SQL:
SELECT id, credits, name, image_url FROM player WHERE ID = '999'
or ID in(select friend_id from player_friends where player_id = '999')
解释:
'1','PRIMARY','player','ALL','PRIMARY',NULL,NULL,NULL,'6994','Using where'
'2','DEPENDENT SUBQUERY','player_friends','ref','index2','index2','198','const,func','1','Using where; Using index'
架构:
CREATE TABLE `player` (
`ID` varchar(32) NOT NULL,
`Name` varchar(45) DEFAULT NULL,
`Credits` decimal(12,3) DEFAULT NULL,
`Access_token` varchar(255) DEFAULT NULL,
`Registered` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`Image_url` varchar(500) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `player_friends` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`player_id` varchar(32) DEFAULT NULL,
`friend_id` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `index2` (`player_id`,`friend_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
【问题讨论】:
-
join 的性能优于子查询
-
您是否在查询中尝试过 AND 而不是 OR?
-
子选择返回多少行?如果有很多(EXPLAIN 输出是否显示 198?不确定如何读取),FTS 将比通过索引更快。
-
@Imran 他们为什么要这样做?这完全改变了查询的含义。假设玩家不能和自己成为朋友,那么 ID 不可能既等于他们的 ID,并且 ID 在子查询的结果中。
-
@Thilo 似乎这是一个 MySQL 错误:-/ bugs.mysql.com/bug.php?id=63701。我在 MySQL 5.5 上使用 Google Cloud SQL。