【发布时间】:2019-03-28 14:25:59
【问题描述】:
我是 android 开发人员,在 mysql 方面没有太多经验。我在 mysql 数据库中有 3 个表。
第一个表:-UserTable
+-------------+-------------+----------+----------------------+
| user_id | name | image | joining_date |
+-------------+-------------+----------+----------------------+
| 100 | King | defualt.jpg | 2018-05-23 20:09:27 |
| 101 | Kochhar | defualt.jpg | 2018-05-23 20:09:27 |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
第二张表:- friendRequests
+-------------+-------------+----------+
| unique_id | from_id | to_id |
+-------------+-------------+----------+
| 1 | 100 | 101 |
| 2 | 200 | 110 |
| - - - - - - - - - - - - - - - - - - -|
| - - - - - - - - - - - - - - - - - - -|
第三张桌子:- 朋友
+-------------+-------------+----------+
| unique_id | from_id | to_id |
+-------------+-------------+----------+
| 1 | 104 | 101 |
| 2 | 206 | 110 |
| - - - - - - - - - - - - - - - - - - -|
| - - - - - - - - - - - - - - - - - - -|
我想获取不是我朋友的用户列表,而且我们还没有待处理的朋友请求。所以我尝试了以下查询:-
SELECT usertable.name,
usertable.user_id,
usertable.image
FROM `UserTable` AS usertable
WHERE usertable.user_id <> '100'
AND (SELECT Count(*)
FROM friendrequests
WHERE ( to_id = '100'
AND from_id = usertable.user_id )
OR ( to_id = usertable.user_id
AND from_id = '100' )) = 0
AND (SELECT Count(*)
FROM friends
WHERE to_id = usertable.user_id
AND from_id = '100'
OR to_id = '100'
AND from_id = usertable.user_id) = 0
ORDER BY usertable.joining_date DESC
LIMIT 10
它正在运行,但需要 436 秒。编写此查询的正确方法是什么?
【问题讨论】:
-
user是一个关键字。它不是表名的好候选。你真的应该把你的桌子命名为别的东西。 -
谢谢@MadhurBhaiya。我已经更新了我的问题。
-
避免在你的选择中使用 select 并尝试使用一些 join 可能吗?
-
你能给我们一个 SQL fiddle 用你的数据来测试一些请求吗?
-
闻起来就像你没有任何索引。请提供
SHOW CREATE TABLE。
标签: mysql performance query-optimization