mysql - SELECT 查询表结构中的 Brighthouse 优化

标签 mysql sql infobright

我在 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';

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

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

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

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

最佳答案

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

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

如果您有一个像这样的文本列,其中包含一组非常小的唯一值(例如……某种状态指示器),那么将该列定义为 LOOKUP 列将会大大受益

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

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

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

由于这个问题大约有 4 个月大,我只是将其发布作为其他偶然发现它的人的引用

关于mysql - SELECT 查询表结构中的 Brighthouse 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21049001/

相关文章:

mysql - Laravel 查询多对多关系

python - CSV 数据到 MySQL 表

mysql - 没有字符的 SQL SELECT 项

mysql - 在 InfoBright ICE 中加载数据时遇到问题

MySQL 选择不带引号的输出文件

mysql - 大型数据库中的数据交换

mysql - 如何在 ruby​​ on Rails 中将数据库(转储文件)从 mysql 数据库导出到 sqlite

MySQL 'AND' 查询未按预期工作

php - MYSQL_FETCH_ARRAY 参数资源错误。

sql - 如何在 Windows Mobile 6.5 中使用数据库