2014-03-25 133 views
0

我有2個表,數據庫設計,加快應用

第一表中存儲的URL

|link_id | link_url | < ==模式url_table :::包含200多萬行

和第二表存儲user_bookmarks

|user_id| link_id | is_bookmarked | < ==用於user_table的模式:::超過350萬行+

is_bookmarked存儲1或0,根據用戶是否加書籤的鏈接。

這是問題所在,

當添加新的鏈接,這些步驟接着
1)檢查URL中url_table已經存在,這意味着要通過數百萬行
2)如果做的不存在url_table和USER_TABLE

數據庫(MySQL的)簡直是花費過多時間,由於巨大的行集,
此外,它的一個很簡單的PHP + MySQL的應用程序添加一個新行,沒有搜索無論何種輔助索引程序。

任何建議,以加快?

+1

您在桌子上創建的任何索引?我不是你可以嘗試創建索引的初學者 –

+1

而且在檢查索引後,對你正在使用的查詢做一個EXPLAIN –

+0

SELECT count(*)作爲總共有多長時間FROM firstTable WHERE \'link_url \'='www。 someUrl.com/something/more/to/this''完全取決於? – MonkeyZeus

回答

0

如果您告訴我們您的CURENT模式是什麼(即CREATE TABLE語句包括索引),而不是列名。然後,我們也許能夠提出切實可行的建議,就如何改進,只是什麼。

肯定有餘地提高添加行的方法:

假設LINK_URL可以比767字節的限制的InnoDB表(你沒有說你使用的引擎),然後變化較大id列包含具有唯一索引的link_url的md5哈希。然後,當您要添加記錄時,請繼續嘗試使用INSERT IGNORE插入....

+0

'link_id'是自動遞增的,如何使用md5散列作爲'link_id'上的唯一索引表現更好? – wolfgang

+0

它省略了2次到數據庫的往返行程,並且索引直接從url派生,因此使用URL的查詢可以使用索引。 – symcbean

1

爲什麼不刪除列user_bookmarks.is_bookmarked,並使用user_id和link_id唯一存在的條目作爲鏈接指示符被收藏了書籤?

新鏈接在user_bookmarks表中沒有條目,因爲沒有人爲其添加書籤。當用戶爲鏈接添加書籤時,添加一個條目。當用戶刪除書籤時,您將刪除該行。

要檢查用戶書籤鏈接或不是,只是SELECT count() FROM user_bookmarks WHERE user_id=? AND link_id=?。當您收到1行時,它被標記爲書籤。當你收到0行時,它不是。

在URL表中添加新條目時,可以使用適當的索引加速插入查詢。

+0

在問題中沒有提及它,但'user_bookmarks'有更多的列,比如'is_visited'等,而'count'()是一個昂貴的操作? – wolfgang

+0

我應該看看NoSQL解決方案嗎? – wolfgang

+0

@wolfgang您可以評估一些NoSQL解決方案,但是您的問題非常普遍,以至於它可以在任何數據庫技術上正常工作。只有當你沒有適當的索引時,計數纔是昂貴的。 – Philipp