mysql - 使用大 in() 子句优化 MySQL 查询

标签 mysql

有一个简单的需求,就是从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/

相关文章:

MySql Order By - 按值和名称自定义排序

mysql - 使用带有函数作为默认值的触发器

mysql - SET 操作和 JOIN 操作

mysql - 如何加入 JSON 键值

javascript - 在多表列中具有多个术语的简单 PHP 过滤器

mysql - 有没有办法在没有慢日志的情况下在 MySQL 中获取 rows_examined?

mysql - 如何使用 SQL 查询从数据库表中获取离散范围内的值

PHP、MySQL、引号和输入字段

php - 使用 php mysql 值的进度条

mysql - 如何比较 SQL Server 的表和 MySQL 的表