Mysql:创build14亿条logging的索引

我有一张有14亿logging的桌子。 表结构如下:

CREATE TABLE text_page ( text VARCHAR(255), page_id INT UNSIGNED ) ENGINE=MYISAM DEFAULT CHARSET=ascii 

要求是为列text创build一个索引

桌子大小约为34G。

我试图通过以下声明创build索引:

 ALTER TABLE text_page ADD KEY ix_text (text) 

经过10个小时的等待,我终于放弃了这个方法。

这个问题有没有可行的解决办法?

更新 :表不太可能被更新或插入或删除。 在列text上创build索引的原因是因为这种sql查询会频繁执行:

 SELECT page_id FROM text_page WHERE text = ? 

更新 :我通过分区表解决了这个问题。

该表格被分成40个栏目text 。 然后在桌子上创build索引需要大约1个小时才能完成。

当表格大小变得非常大时,似乎MySQL索引创build变得非常慢。 分区将表格缩小为更小的中继。

    难道是你的系统只是没有达到任务? 我不使用MySQL(这里是SQL Server),但我知道索引一个8亿条目表的痛苦。 基本上….你需要正确的硬件(如:许多快速光盘)。 我现在使用近十几个Velociraptors,performance很棒;)

    SQL服务器(不是MS SQL Server,而是使用SQL的数据库服务器)随着光盘访问而生存,并且正常的光盘不能满足较大操作的要求。

    您可能需要为文本字段的第一个(例如10个)字符创build索引。

    从文档:

    可以创build仅使用列值的前导部分的索引,使用col_name(length)语法指定索引前缀长度:

     CREATE INDEX ix_text ON text_page (text(10)) 

    把sort_buffer_size设置为4GB(或者你可以根据你有多less内存来设置)。

    现在,创build索引正在做一个sorting,但由于你有一个32MB的sort_buffer_size,基本上是不必要地硬盘驱动器。

    如果您不需要进行如下查询:

     SELECT page_id FROM text_page WHERE text LIKE '?%'; 

    我会build议创build一个新的哈希列,并按列索引表。 表+索引的整体大小可能要小得多。

    UPD :顺便说一下,14亿个主键整数约占6 GB,即string的平均长度小于30个字符,即对索引进行索引可能更为可取。

    你还应该看看MERGE存储引擎。

    我已经通过分区表解决了这个问题。

    该表格被分成40个栏目text 。 然后在桌子上创build索引需要大约1个小时才能完成。

    当表格大小变得非常大时,似乎MySQL索引创build变得非常慢。 分区将表格缩小为更小的中继。

    一种方法是使用索引集创build一个新表,并将数据复制到新表中。

    另外,确保你有足够的临时空间。

    如果你仍然想知道如何做到这一点,我build议你使用在线改变表格工具。

    网上有很多,其中着名的有:

    我们对于大桌子(超过500mil的logging)也有同样的问题,而且这种改变也很完美。 它创build一个新的tmp表,在原始表上添加触发器(用于新的更新/删除/插入logging),同时它将所有logging复制到新表(使用新结构)

    祝你好运!