SQL优化

时间:2010-11-04 14:31:04

标签: mysql optimization

我在我的数据库上有这个查询,它基本上是从坐标半径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)

你们能帮助我优化这个查询吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

您将始终需要FILESORT(在临时内存中对结果数据进行排序),因为您“排序”未编入索引的内容(rand())。

根据您的DBMS的优化功能,您最好使用“AND id!='6'AND id!='4118'”而不是“NOT IN”子句。

您应该始终先在查询中说明固定信息,但这也取决于查询优化器的功能。此外,标准应与索引对齐,这意味着标准的出现顺序应与您希望DMBS使用的索引中的顺序相同。通常有一个选项可以说明要使用哪个索引(关键字是“索引提示”),但是大多数DMBS最了解在大多数情况下要使用的索引(从查询本身猜测)。

当您使用在查询运行时(您的函数)生成的标准时,您将永远无法绕过USING TEMPORARY。