mysql - 优化SQL查询(类似Facebook的应用程序)

标签 mysql optimization

我的应用程序类似于 Facebook,我正在尝试优化获取用户记录的查询。用户记录是他作为 src 或 dst。 src 直接位于 usermuralentry 中,dst 列表位于 usermuralentry_user 中。

因此,一个条目可以有一个 src 和多个 dst

我有这些表:

mysql> desc usermuralentry ;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| id              | int(11)          | NO   | PRI | NULL    | auto_increment |
| user_src_id     | int(11)          | NO   | MUL | NULL    |                |
| private         | tinyint(1)       | NO   |     | NULL    |                |
| content         | longtext         | NO   |     | NULL    |                |
| date            | datetime         | NO   |     | NULL    |                |
| last_update     | datetime         | NO   |     | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+
10 rows in set (0.10 sec)


mysql> desc usermuralentry_user ;
+-------------------+---------+------+-----+---------+----------------+
| Field             | Type    | Null | Key | Default | Extra          |
+-------------------+---------+------+-----+---------+----------------+
| id                | int(11) | NO   | PRI | NULL    | auto_increment |
| usermuralentry_id | int(11) | NO   | MUL | NULL    |                |
| userinfo_id       | int(11) | NO   | MUL | NULL    |                |
+-------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

以下查询用于检索两个用户的信息。

mysql> explain

SELECT *
FROM usermuralentry AS a
   , usermuralentry_user AS b
WHERE a.user_src_id IN ( 1, 2 )
   OR
   (
      a.id = b.usermuralentry_id
         AND b.userinfo_id IN ( 1, 2 )
   );
+----+-------------+-------+------+-------------------------------------------------------------------------------------------+------+---------+------+---------+------------------------------------------------+
| id | select_type | table | type | possible_keys                                                                             | key  | key_len | ref  | rows    | Extra                                          |
+----+-------------+-------+------+-------------------------------------------------------------------------------------------+------+---------+------+---------+------------------------------------------------+
|  1 | SIMPLE      | b     | ALL  | usermuralentry_id,usermuralentry_user_bcd7114e,usermuralentry_user_6b192ca7 | NULL | NULL    | NULL |  147188 |                                                |
|  1 | SIMPLE      | a     | ALL  | PRIMARY                                                                                   | NULL | NULL    | NULL | 1371289 | Range checked for each record (index map: 0x1) |
+----+-------------+-------+------+-------------------------------------------------------------------------------------------+------+---------+------+---------+------------------------------------------------+
2 rows in set (0.00 sec)

但是这需要很多时间......

一些优化技巧?我的应用程序中的表架构可以更好吗?

最佳答案

使用此查询

SELECT *
FROM usermuralentry AS a
left join usermuralentry_user AS b
on b.usermuralentry_id = a.id
WHERE a.user_src_id IN(1, 2)
OR (a.id = b.usermuralentry_id
AND b.userinfo_id IN(1, 2));

这里有一些提示
您在 from 子句中使用两个表,这是一个 cartision 产品,将花费大量时间以及不期望的结果。在这种情况下始终使用联接。

关于mysql - 优化SQL查询(类似Facebook的应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287218/

相关文章:

mysql - 实时服务器中当前时间戳字段的默认值无效

python - 在 python 中打印数字的唯一因子

javascript - 使用对象字面量来跟踪多个(未知)计数的简洁方法是什么?

php - 如何使用 codeigniter 优化 activerecords?

mysql迁移表数据

mysql - SQL 从表中插入国家/地区名称

mysql - 有没有办法加快这个 MySQL 删除查询的速度?

mysql - 我如何知道何时应该优化我的查询?

php - 为什么这个测试 SQL 注入(inject)没有返回表中的所有行?

mysql - 使用/用户输入连接三个表