2010-08-18 63 views
2

我有一个名为page的表格,它代表了我网站上的每一个页面。MySQL:创建访问系统的最佳方式是什么?

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>) 

...返回,我应该有机会获得页面。

工作正常,但似乎缓慢与行> 100,000 你会怎么做呢?你会以不同的方式做到这一点吗?

回答

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 2010-08-18 10:41:44

+0

谢谢,我会试试看,并让你知道:) – Bald 2010-08-19 12:45:30

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 2010-08-19 12:46:39

+0

@Bald:哦,很好。并且它们是否被这个查询使用? – Piskvor 2010-08-19 13:08:03

相关问题