我在我的数据库上有这个查询,它基本上是从坐标半径10英里范围内拉出的。
SELECT id
FROM business
WHERE ( coordinates!=''
AND getDistance('-2.1032155,49.1801863', coordinates)<10 )
AND id NOT IN ('6', '4118') ORDER BY rand() LIMIT 0,5
当我分析此查询时,我得到了这个: 加入规模:3956(坏) 使用临时(坏) USINGI FILESORT(BAD)
你们能帮助我优化这个查询吗?
提前致谢
答案 0 :(得分:0)
您将始终需要FILESORT(在临时内存中对结果数据进行排序),因为您“排序”未编入索引的内容(rand())。
根据您的DBMS的优化功能,您最好使用“AND id!='6'AND id!='4118'”而不是“NOT IN”子句。
您应该始终先在查询中说明固定信息,但这也取决于查询优化器的功能。此外,标准应与索引对齐,这意味着标准的出现顺序应与您希望DMBS使用的索引中的顺序相同。通常有一个选项可以说明要使用哪个索引(关键字是“索引提示”),但是大多数DMBS最了解在大多数情况下要使用的索引(从查询本身猜测)。
当您使用在查询运行时(您的函数)生成的标准时,您将永远无法绕过USING TEMPORARY。