我在MySQL中有一张包含数百万条记录的表 - >使用维基页面中的注释导入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'条款,而不是'=',另外选择'a'在d,e?on? 例如:
SELECT a,d,e FROM `myTable` WHERE a IN ('myString1','myString2'.... etc )
答案 0 :(得分: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个月之久,我有点只是将其作为参考,以便其他人偶然发现它