有一个简单的需求,就是从Friend
表中查询六度关系的数量。
Friend
的结构是这样的:
+----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| userId | int(11) | NO | MUL | NULL | |
| friendId | int(11) | NO | | NULL | |
+----------+---------+------+-----+---------+----------------+
假设我想知道userId:1
的六度关系量,我写下了这样的六个查询
SELECTfriendId FROM Friend WHERE userId = 1
获取一级好友。
然后执行
SELECTfriendIdFROMFriendWHEREuserIdin(/*以上查询结果*/)
五次。
问题并不像看起来那么简单,因为我的 Friend 表中有数百万条记录。
用户1
的六度关系数量很有可能大于六位数,尽管他/她只有两个一级关系好友。
IN 子句中的项目数量呈指数级增长。
然后,六个查询需要一分钟多才能得到结果。
如何优化这种情况?
最佳答案
您可以使用subqueries看看 MySQL 优化器是否足够聪明,可以将它们重写为连接(通常会这样做)。
但实际上 RDBMS 并不适合这项任务。更好地研究基于图形的数据库。请参阅this question例如。
关于mysql - 使用大 in() 子句优化 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33918706/