我有一个SELECT语句,我想优化它。mysql -通过优化排序说,在某些情况下,索引不能用于优化ORDER BY。具体而言,要点:
对键的非连续部分使用ORDER 从t1中选择* key2=constant ORDER BY key_part2;
让我想,这可能是真的。我使用以下索引:
UNIQUE KEY `met_value_index1` (`RTU_NB`,`DATETIME`,`MP_NB`),
KEY `met_value_index` (`DATETIME`,`RTU_NB`)使用以下SQL-语句:
SELECT * FROM met_value
WHERE rtu_nb=constant
AND mp_nb=constant
AND datetime BETWEEN constant AND constant
ORDER BY mp_nb, datetimemet_value_index1并使用新的排序RTU_NB、MP_NB、DATETIME创建索引是否足够?ORDER BY子句中?
结果:,我尝试了@meriton的建议,并添加了索引met_value_index2。SELECT在1.2秒后完成,之前在5.06秒后完成。下面不属于这个问题,但附带说明:经过一些其他尝试之后,我将引擎从MyISAM切换到了InnoDB --以rtu_nb, mp_nb, datetime作为主键--在0.13秒后完成了语句!
发布于 2011-12-22 22:37:12
我不明白你的疑问。如果某一行必须与要返回的mp_np = constant匹配,则返回的所有行都将具有相同的mp_nb,因此将mp_nb包含在order子句中无效。我建议您使用语义等效的语句:
SELECT * FROM met_value
WHERE rtu_nb=constant
AND mp_nb=constant
AND datetime BETWEEN constant AND constant
ORDER BY datetime以避免不必要地混淆查询优化器。
现在,关于您的问题:如果数据库知道基础访问将以正确的顺序返回行,它就可以实现order子句而不进行排序。对于索引,这意味着如果where子句匹配的行按照order子句请求的顺序出现在索引中,则索引可以帮助排序。
这里就是这种情况,因此数据库实际上可以在met_value_index1上对rtu_nb=constant AND datetime BETWEEN constant AND constant所在的行进行索引范围扫描,然后检查每个行是否有mp_nb=constant,但是如果mp_nb=constant具有很高的选择性,这就相当于检查更多的行。换句话说,如果匹配的行在索引中是连续的,那么索引是最有用的,因为这意味着索引范围扫描只会触及实际需要返回的行。
因此,以下索引将对此查询更有帮助:
UNIQUE KEY `met_value_index2` (`RTU_NB`,`MP_NB`, `DATETIME`),因为所有匹配的行都将在索引中彼此相邻,并且这些行将按照order by子句请求的顺序出现在索引中。我不能说查询优化器是否足够聪明,因此您应该检查执行计划。
发布于 2011-12-22 17:23:35
我不认为它将使用任何索引的订单。但是你应该看看执行计划。或这里.
发布于 2011-12-22 17:22:16
字段在WHERE子句中出现的顺序必须与索引中的顺序匹配。因此,对于当前的查询,您需要一个按rtu_nb、mp_nb、datetime顺序的字段索引。
https://stackoverflow.com/questions/8607475
复制相似问题