2010-08-18 3 views
2

내 웹 사이트의 모든 단일 페이지를 나타내는 page이라는 테이블이 있습니다.MySQL : 액세스 시스템을 만드는 가장 좋은 방법은 무엇입니까?

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

목표 :

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

는 또한 표는 group라고 어떻게 하나의 그룹에 대한 모든 페이지에 대한 액세스 권한을 정의하려면?

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

페이지의 표 (page_group)에 액세스 할 수있는 그룹이 포함되어 있습니다 : 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>) 

... 난에 액세스 할 수 있어야 페이지를 반환

나는 기능을 썼다.

잘 작동하지만 행이 느린 것 같습니다.> 100000 어떻게 하시겠습니까? 다른 방식으로 그렇게 할 수 있습니까?

답변

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> 
+0

놀랍게도 (나에게)이 검사는 매우 효율적인 방법입니다. 좋은 인덱스를 가지고 있다면 mySQL을 최적화 할 수 있습니다. – Piskvor

+0

감사합니다, 나는 그것을 시도하고 알려 드리겠습니다 :) – Bald

0

EXPLAIN SELECT와의 쿼리의 결과 - 테이블에 인덱스가없는 것 같습니다. 또 다른 추측 : (page_group.page_group,page_group.group_id)에 색인은 것을 위로 속력을 낼지도 모르다. this introduction on EXPLAIN을 참조하십시오.

또한 @Michael Pakhantsov's answer with the subquery을 참조하십시오. 서버가 UDF보다 하위 쿼리를 더 쉽게 최적화 할 수 있습니다.

+0

나는 색인을 가지고 :) – Bald

+0

@ 팔드 : 오, 좋아. 그리고 그들은이 쿼리에 의해 사용됩니까? – Piskvor

관련 문제