我需要搜索比实际大的最接近的Dialcode。例如,最接近的33将是331或332(如果331不存在)...所以它必须是33xxxx,34是无效的。缓慢的mysql查询Like /匹配
这2个查询工作,但速度太慢(250毫秒/行):
SELECT Dialcode
FROM table
WHERE (Dialcode LIKE '$var%' AND Dialcode > '$var' AND Price IS NOT NULL)
ORDER BY Dialcode ASC LIMIT 1
SELECT Dialcode
FROM table
WHERE (MATCH(Dialcode) AGAINST ('$var*' IN BOOLEAN MODE) AND Dialcode > '$var'
AND Price IS NOT NULL)
ORDER BY Dialcode ASC LIMIT 1
我Dialcode是主键BIGINT(15)。
是我这样做,这是非常快(> 1毫秒/行),但它不正是我需要的:
SELECT Dialcode
FROM table
WHERE (Dialcode >= '$var' AND Price IS NOT NULL)
ORDER BY Dialcode ASC LIMIT 1
所以我想我的问题是,LIKE /对阵。
任何想法,将不胜感激。
Update解决方案:
解决方案改编自raina77ow建议:
SELECT Dialcode FROM table WHERE (((Dialcode BETWEEN $var * 1 AND ’9’)
OR (Dialcode BETWEEN $var * 10 AND $var.’99’)
OR (Dialcode BETWEEN $var * 100 AND $var.’999’)
OR (Dialcode BETWEEN $var * 1000 AND $var.’9999’)
…
) AND Price IS NOT NULL) ORDER BY Dialcode ASC LIMIT 1
谢谢你们!
Hm'LIKE'需要强制转换为字符串/字符,这可能需要一段时间。您可以在表的副本上测试该理论:将列转换为字符,并查看其执行方式。 – Wrikken
是的,我宁愿将列投射到一个字符,然后建立另一个索引;那么简单的LIKE CONCAT(值+'%')将会创造奇迹,我想它应该达到索引。 – raina77ow