我有数百个网站查询,如下所示:
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中运行良好(有效地使用索引)?
答案 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
之前?而且它们在桌子上乱七八糟,从而减慢了你的优化尝试?如果是这样,可能值得将这些行移出表格。