2010-08-18 86 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

相關問題