如何优化具有多个不等式的mysql查询?

时间:2015-12-16 03:31:35

标签: mysql amazon-web-services query-optimization database-performance query-performance

我有数百个网站查询,如下所示:

SELECT blah, blah, blah FROM sometable
WHERE '2015-12-15 18:55:20' BETWEEN date_from AND date_to  
AND date_from > '2015-06-26 10:40:08'  
and ctcx_latitude >= 41.87403474 and ctcx_latitude <= 41.93293328 
and ctcx_longitude >= -87.64343262 and ctcx_longitude <= -87.61356354 
and (LP_LIST_PRICE BETWEEN 90000 and 250000) and BTH_BATHS >= 1.0 and BR_BEDROOMS >= 1
and ASM_ASSESMENT_ASSOCIATION_DUES <= 500 
order by LP_LIST_PRICE

注意每个条件是不平等的。

MYSQL完全无法使用此查询的任何索引。我已经尝试了很多可能的组合,但归结起来的是,mysql优化器似乎没有正确识别不等式。这是Amazon RDS上的mysql5.6(支持最新版本)。

目前,我可以通过增加服务器内存以匹配表大小来解决这个问题,但这已经超过了必要的4倍,而且只会变得更糟。

这种查询能否在mysql中运行良好(有效地使用索引)?

1 个答案:

答案 0 :(得分:0)

  

和ASM_ASSESMENT_ASSOCIATION_DUES&lt; = 500

注意 - 如果该列可以为NULL,则可能会导致WHERE陷入混乱。建议您默认为0,而不是NULL

你有一个棘手的问题,对此没有好的答案。某些列(例如BTH_BATHS)不值得索引。许多其他人可能有选择性有时候。如果您有单列索引,优化程序将尝试在其中选择最佳。 (它有时会搞砸,因为统计数据相当简单。)

您的示例似乎有一个相当窄的纬度/经度边界框。如果这是最好的约束,并且您有很多行,那么您可以考虑http://mysql.rjweb.org/doc.php/latlng中的代码。

'2015-12-15 18:55:20' BETWEEN date_from AND date_to - 或许大多数行都在date_from之前?而且它们在桌子上乱七八糟,从而减慢了你的优化尝试?如果是这样,可能值得将这些行移出表格。