【问题标题】:mySQL large text comparisson performance... best practices?mySQL 大文本比较性能...最佳实践?
【发布时间】:2009-02-04 14:23:17
【问题描述】:

我有一个较大的(约 150 万条记录)表,其中包含不同长度的文本字符串,我运行查询以查找匹配项:

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 小时运行,需要尽可能快。

感谢任何帮助。

更新: 为了澄清,我在“shingle”列上进行一对一的匹配,而不是在其中进行文本搜索。

【问题讨论】:

  • 哇。这里没有想法,但很好的问题。
  • 谢谢,但这不仅仅是一个很好的问题,这是一个让我大吃一惊的要求!
  • @jqs:你能发布一个你正在做的示例查询吗?你说的索引很难维护是什么意思?我们有一个表,它有超过 1000 万行和 100 多列,有 20 个索引,我们对许多用户进行了大量的插入/更新和搜索。我们的表现相当不错。

标签: mysql performance indexing


【解决方案1】:

首先:你的 bigint 主键可能会毁了你,这是一种维护起来非常昂贵的类型。 150 万条记录远未接近 unsigned int 的限制(约 42 亿)。

在 InnoDB 中使用大 int 作为主键更糟糕,因为它针对每个其他索引中的每个条目存储 PK,因此可以部分解释当您尝试切换时出现的问题。一旦你从表中添加和删除,如果有很多并发事务,MyISAM 就会搞砸。

避免字符串比较开销的一个技巧是存储 crc32(shingle) 和 shingle。然后您索引此列,但不索引您的 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 索引的第二个组件

【讨论】:

    【解决方案2】:

    对于初学者,请使用 InnoDB 而不是 MyISAM。这将解决在进行插入的同时进行查询的问题。

    您可能需要稍微调整一下 mysql 配置以将内存用于 innodb(innodb_buffer_pool_size 而不是 key_buffer_size)。

    【讨论】:

    • 我已经尝试过迁移到 InnoDB,但这实际上减慢了速度。我现在正在分析我的查询并尝试其他性能改进。
    • 您是否确保为 InnoDB 正确配置 MySQL 服务器?在所有安装的 97% 中,InnoDB 会更快(是的,这个数字是编造的,但我敢打赌它不会太远......)
    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多