我在我的数据库上有这个查询,它基本上是拉出距离坐标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当我分析这个查询时,我得到这个: JOIN SIZE: 3956 (BAD) USINGI FILESORT (BAD) USINGI FILESORT (BAD)
你们能帮我优化这个查询吗?
提前感谢
发布于 2010-11-04 22:41:55
您将始终需要FILESORT (对临时内存中的结果数据进行排序),因为您需要“排序依据”未索引的内容(rand())。
根据DBMS的优化能力,最好使用"AND id != '6‘AND id != '4118'“而不是"NOT IN”子句。
您应该始终在查询中首先声明固定信息,尽管这也取决于查询优化器的功能。此外,标准应该与索引对齐,这意味着标准的出现顺序应该与您希望DMBS使用的索引中的顺序相同。通常有一个选项来声明使用哪个索引(关键字是"Index hint"),但大多数DMBS最清楚在大多数情况下使用哪个索引(从查询本身猜测)。
而且,当您使用查询运行时生成的条件(您的函数)时,您将永远不会使用临时。
https://stackoverflow.com/questions/4097668
复制相似问题