【发布时间】:2013-07-09 01:03:23
【问题描述】:
我有一张谁和谁交朋友的表格,简单如下:
user_id1 | user_id2 | <some other data>
具有非唯一索引:index_on_user1 和 index_on_user2
两列都包含相同类型的数据,友谊总是双向的。
1 | 2
=用户1是用户2的朋友,用户2是用户1的朋友。
我想要的是获得一个查询,该查询将始终为我提供我提供的任何 user_id 的朋友列表。
到目前为止,我一直在使用
SELECT if(`user_id1` = $user_id, `user_id2`, `user_id1`) as friend
FROM `Friends`
WHERE `user_id1` = $user_id OR `user_id2` = $user_id
但我有更多查询,我想在其中获取此信息作为子查询,并将包含此查询的视图作为子查询。所以我一直在寻找一种方法来抽象这个,有一些简单的选择,总能得到我朋友的 id,而没有if 声明的麻烦。
我对联合有了这个想法:
CREATE OR REPLACE VIEW get_friend AS
SELECT
`user_id1` as subject,
`user_id2` as friend,
FROM `Friends`
USE INDEX (`index_on_user1`)
UNION
SELECT
`user_id2` as subject,
`user_id1` as friend,
FROM `Friends`
USE INDEX (`index_on_user2`)
使用简单的SELECT friend FROM get_friend WHERE subject = $user_id 来获得结果,它可以工作。
但是explain select... 说它不使用索引,即使有提示也不使用。
我怎样才能让它使用这些索引?甚至可能吗?还有其他解决方案吗?
【问题讨论】:
-
存储过程可能会更好,因为它可以将 ID 替换到查询中。
标签: mysql view indexing query-optimization