2010-11-04 67 views
0

我在我的数据库中有这个查询,它基本上是从坐标半径10英里内拉出来的。SQL优化

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(BAD) 使用临时(BAD) USINGI文件排序(BAD)

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

在此先感谢

回答

0

你总是需要文件排序“按订单”的东西,不被索引(排序在临时存储器中所得到的数据),你(RAND())。

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

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

而当您使用在查询运行时(您的函数)生成的标准时,您永远不会使用USING TEMPORARY。

+0

我总是使用IN()来检查条件的子集。这是一个不好的练习吗?例如,如果我想计算成员对他最喜欢的东西,我会这样做:SELECT * FROM table WHERE member_id IN(1,2,3,4,5,6,7,8,... 2000) – gumpi 2010-11-04 14:50:38

+0

用一粒盐来表达我的看法。这在很大程度上取决于特定DMBS的功能。如果查询优化器很聪明,它可以轻松地将IN语句展开到相应的“field ='值'OR ...”语句中。但是我看到DBMS在这方面失败了;并且函数会在每个记录上向覆盖层报告之前运行,这使查询变慢。 – 0xCAFEBABE 2010-11-04 15:10:41