2009-02-04 24 views
2

我已經得到了持有不同長度的文本字符串,我運行查詢對尋找匹配一個相當大的(〜1.5M記錄)表:mySQL大文本comparisson性能...最佳實踐?

CREATE TABLE IF NOT EXISTS `shingles` (
    `id` bigint(20) NOT NULL auto_increment, 
    `TS` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
    `shingle` varchar(255) NOT NULL, 
    `count` int(11) NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `shingle` (`shingle`,`TS`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1571668; 

我的問題是我需要的,而我做的與此表進行比較我不斷地添加和刪除數據,因此維護索引非常困難。

我正在尋找最佳做法,以及時管理插入,同時最大化選擇的吞吐量。這個過程每天24小時運行,並且需要儘可能快。

任何幫助表示讚賞。

更新:爲了澄清,我正在做一對一的'瓦特'列匹配,而不是在其中的文本搜索。

+0

哇的第二部分。這裏沒有想法,但很好的問題。 – 2009-02-04 14:47:31

+0

謝謝,但它不僅僅是一個很好的問題,它是一個要求我的垃圾! – jqs 2009-02-04 18:31:43

回答

0

對於初學者,請使用InnoDB代替MyISAM。這將解決在做插入時做查詢的問題。

你可能需要調整一下你的mysql配置來使用innodb的內存(innodb_buffer_pool_size而不是key_buffer_size)。

1

第一:你的bigint主鍵可能會在這裏被殺死,這是一個非常昂貴的類型,試圖維護。 150萬條記錄遠未達到無符號整數限制(約42億)。

對InnoDB使用主鍵的大int值更糟,因爲它將PK存儲在每個其他索引中的每個條目中,以便在嘗試切換時可以部分解釋問題。一旦你添加並從表中刪除MyISAM將會被搞砸,如果有很多併發事務。

解決字符串比較花費的一個竅門是存儲crc32(木瓦)以及木瓦。然後,您索引此列,但不是您的varchar。像下面的東西是我怎麼會做它:

CREATE TABLE IF NOT EXISTS `shingles` (
    `id` int unsigned NOT NULL auto_increment, 
    `TS` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
    `crc` int unsigned not null, 
    `shingle` varchar(255) NOT NULL, 
    `count` int(11) NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `crc` (`crc`) 
) 
insert into shingles (crc, shingle, count) values (crc32('testtest'),'testtest',1),(crc32('foobar'),'foobar',4); 
select * from shingles where crc = crc32('foobar') and shingle = 'foobar'; 

如果您打算在「TS」查詢然後將其添加爲CRC指數