1

我在 MySQL 中有一个包含数百万条记录的表-> 使用 wiki 页面中的注释导入 Infobright,没问题!

这是表格语法

CREATE TABLE `myTable` (
  `a` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `b` varchar(255) COLLATE latin1_bin DEFAULT NULL,
  `c` bigint(20) NOT NULL,
  `d` bigint(20) NOT NULL,
  `e` int(10) NOT NULL
) ENGINE=BRIGHTHOUSE

现在我需要运行一个选择查询 450 次,每次使用不同的 'a' 时都会使用这样的约束:

SELECT d,e FROM `myTable` WHERE a = 'myString';

目标是加快调用所有查询的总时间。但我有问题。当我运行选择查询大约 450 次时,平均每个查询需要 0.52 秒!

然而,当我通过 MySQL 运行它时,每个查询大约需要 1.7 毫秒!

我该如何优化它以击败 MySQL 时间?是否需要我使用 'IN' 子句,而不是 '=' 并在 d,e 之上额外选择 'a'?例如:

SELECT a,d,e FROM `myTable` WHERE a IN ('myString1','myString2'.... etc )
4

1 回答 1

2

Infobright 擅长处理数字数据(特别是在查询条件方面)。它们不支持传统的 BTREE 索引,因为它们使用“知识网格”元数据系统。当您运行时WHERE a = 'myString',您会强制引擎打开每个数据包行(通常每个数据包行有 50,000 行数据)并对每条记录进行字符串比较。

MySQL 确实支持 BTREE 索引,这将为您在此处提到的基于文本的查询条件提供更好的性能。鉴于您已经说过您需要运行 450 次查询,我假设您至少有 450 个 `a` 的唯一值。

如果您有一个像这样的文本列,其中包含非常小的唯一值集(例如......某种状态指示器),您将从将列定义为 LOOKUP 列中受益匪浅

`a` varchar(255) COLLATE latin1_bin DEFAULT NULL COMMENT 'lookup'

注意:这种表设置为低基数列提供了最佳性能,最好为 varchar() 分配较小的大小,而不是 255。

对于这组查询,您最好还是坚持使用 MySQL,或者重新处理数据以将这些值转换为 Infobright 中的数字数据。

由于这个问题大约有 4 个月大,所以我只是将其发布为其他任何偶然发现它的人的参考

于 2014-05-02T04:55:01.457 回答