2010-06-09 60 views
2

我有2個數據庫,我需要鏈接兩個大表(每個超過3M條目,不斷增長)之間的信息。 第一個數據庫有一個表「頁面」,用於存儲有關網頁的各種信息,幷包含每個網頁的URL。列'URL'是一個varchar(512)並且沒有索引。Mysql InnoDB性能優化和索引

的第二數據庫具有定義爲表 'urlHops':

CREATE TABLE urlHopsdest VARCHAR(512)NOT NULL, src VARCHAR(512)DEFAULT NULL, timestamp時間戳NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY dest_keydest) KEY src_keysrc) )ENGINE = InnoDB的默認字符集= LATIN1

現在,我基本上需要發出(高效)這樣的查詢: 從db1.pages中選擇p.id,p.URL,db2.urlHops u其中u.src = p.URL和u.dest =?

起初,我想在頁面(URL)上添加一個索引。但是這是一個非常長的列,我已經在同一張表上發佈了很多INSERT和UPDATE(比使用這個索引的選擇的數量要多)。

我認爲的其他可能的解決方案是: - 爲頁面添加一列,存儲URL的md5散列並將其編入索引;通過這種方式,我可以使用URL的md5進行查詢,並且可以在較小的列上使用索引。 - 添加另一個只包含頁面標識和頁面URL的表格,爲兩列編制索引。但是,這可能是浪費空間,只有不減慢我在'頁面'上執行的插入和更新的優勢。

我不想放慢插入和更新,但同時我可以有效地對URL進行查詢。有什麼建議?我最關心的是表現;如果需要,浪費一些磁盤空間不是問題。

謝謝你,至於

達維德

+0

@Gary:我之前試過這樣做,但是urlHops是我以極高的速度插入數據的表,所以我不能將它分成兩部分(我基本上需要追加到它的src和dest夫婦URL)。如果我像這樣分割它,那麼它上面的插入就會減慢我的需要。 – 2010-06-09 21:32:09

回答

0

如果頁面,URL的是1對1的關係,並且表有唯一的ID(主鍵?),你可以存儲值在該ID在urlHops表中的src和dest字段而不是完整的URL。

這將使索引和聯接更高效。

+0

即使我沒有1對1的映射,也會嘗試使用此解決方案......我希望它工作得相當好 – 2010-06-09 22:35:41

0

我會創建一個包含auto-inc整數主鍵和你的URL值的page_url表。然後更新Pages和urlHops以使用page_url.id。

您的urlHops將變爲(dest int,src int,...)
Your Pages表將用pageid替換url。

索引page_url.url字段,你應該很好去。

3

你的MD5哈希建議非常好 - 它被記錄在High Performance MySQL 2nd Ed中。有一些技巧來獲得它的工作:

CREATE TABLE網址( ID NOT NULL主鍵AUTO_INCREMENT, 網址爲varchar(255)NOT NULL, url_crc32 INT UNSIGNED NOT NULL, INDEX(url_crc32) ) ;

選擇查詢必須是這樣的:

SELECT * FROM網址,其中URL = 'http://stackoverflow.com 'AND url_crc32 = CRC32(' http://stackoverflow.com');

url_crc32被設計爲與索引一起使用,包括WHERE子句中的url用於防止哈希衝突。

我可能會推薦crc32超過md5。將會有更多的碰撞,但你有更高的機會將所有的索引放在內存中。