MySQL:创建访问系统的最佳方法是什么?

时间:2010-08-18 10:30:37

标签: sql mysql

我有一个名为page的表,代表我网站中的每一页。

page_id | page_subject | page_path
----------------------------------
1       | Foo          | /Foo
2       | Bar          | /Bar

我还有一个名为group的表:

group_id | group_name
---------------------
1        | Users
2        | Admins

目标:如何定义单个组的每个页面的访问权限? 我确实创建了另一个表 - page_group

page_group | group_id
---------------------
1          | 1
1          | 2

表包含有权访问页面(page_group)的组。

我写了函数:

CREATE FUNCTION `PAGE_ACCESS`(`pageId` INT, `groupId` MEDIUMINT)
BEGIN
   RETURN IF((SELECT COUNT(*) FROM `page_group` WHERE page_id = pageId AND group_id = groupId) > TRUE, FALSE);
END;

现在我可以这样做:

SELECT * 
FROM page 
WHERE <conditions> AND PAGE_ACCESS(page_id, <group_id>)

...返回我应该有权访问的页面。

工作正常但似乎行速慢&gt; 100000 你会怎么做?你会以不同的方式做到这一点吗?

2 个答案:

答案 0 :(得分:2)

尝试:

SELECT * 
from Page p
WHERE EXISTS (SELECT 1 from page_group pg join group g 
              on (pg.group_id = g.groupidId)
              WHERE g.group_id = <groupId>
                AND p.page_id = pg.page_id)

你也可以尝试(只是意识到不需要组表):

SELECT * 
from Page p
WHERE p.page_id IN (Select page_id
                    from page_group pg
                    WHERE pg.group_id = <group_id>)

甚至:

SELECT p.* 
from Page p JOIN page_group pg ON (p.page_id = pg.page_id)
WHERE pg.group_id = <group_id>

答案 1 :(得分:0)

我会用EXPLAIN SELECT测试查询的速度 - 我猜你没有表上的索引?另一种猜测:(page_group.page_group,page_group.group_id)上的索引可能会加快速度。请参阅this introduction on EXPLAIN

此外,请参阅@Michael Pakhantsov's answer with the subquery - 服务器优化子查询比UDF更容易。