2016-10-20 119 views
2

我有一个非常有效的狮身人面像查询工作在一张桌子上。然而,不幸的是,部分查询需要一个由100个选项组成的大型“OR”语句。狮身人面像上结合Mysql和Sphinx查询?

@(field) (1|2|..|800)

相当严重走,只要一分钟扼流圈而在MySQL中同一管道查询需要<1秒是否做

field in (1,2,..,800

甚至

Field =1 or Field=2 or Field=... or Field=800

有没有办法在一个查询中结合两者?

回答

0

狮身人面像可以做in(..) ATTRIBUTEs上的查询。

可能不是同样有效的MySQL(至少如果索引列)

sphinxQL> SELECT * FROM index WHERE MATCH('...') AND attrib IN (1,2,...) 
+0

我假设这会比'@(field)(1 | 2 | ...)'更有效率吗?我试图在这里测试,但'attribname ='1''工作'attribname在('1',2',...)'给我错误“[Err] 1064 - sphinxql:语法错误,意外的QUOTED_STRING,期待CONST_INT或' - '在''1','2'''''附近''' – user3649739

+0

我想我需要改变我的attrib类型,我会回报对不起。 – user3649739

+0

一旦我固定attr类型就像一个魅力。为了参考起见,当我将2000个ID放在Match中作为'@(Field)1 | 2 | ... | 2000'花了两分钟,当我在(1,2,...,2000) )耗时.126秒。事实上,然后Mysql查询更快... – user3649739

0

如果ATTRIB是VARCHAR,那么这是最好的MySQL:

WHERE attrib IN ('1', '2', ...) 

如果是数字,然后这对于MySQL来说是最好的:

WHERE attrib IN (1, 2, ...) 

请注意,常数是wr ong类型会导致严重的低效率。