首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化SQL查询(类似Facebook的应用程序)

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

Stack Overflow用户
提问于 2012-07-02 10:27:39
回答 2查看 145关注 0票数 0

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

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

我有这些表:

代码语言:javascript
复制
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)

和下面的查询来从两个用户检索信息。

代码语言:javascript
复制
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)

但这需要很长时间..。

一些优化的提示?在我的应用程序中,表模式可以更好吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-02 13:34:43

使用此查询

代码语言:javascript
复制
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产品,将花费大量时间并产生不希望看到的结果。在这种情况下,始终使用joins。

票数 1
EN

Stack Overflow用户

发布于 2012-07-02 13:29:26

我认为您的连接格式不正确,您需要更改查询以使用UNION。where子句中的OR条件也会降低性能:

代码语言:javascript
复制
SELECT *
FROM usermuralentry AS a
 JOIN usermuralentry_user AS b ON a.id = b.usermuralentry_id /* use explicit JOIN! */
WHERE a.user_src_id IN (1 , 2)
 UNION
SELECT *
FROM usermuralentry AS a
 JOIN usermuralentry_user AS b ON a.id = b.usermuralentry_id 
WHERE b.usermuralentry_id IN ( 1, 2 )   

还需要一个索引: ALTER TABLE usermuralentry_user ADD INDEX (usermuralentry_id)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11287218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档