我在 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/