MySQL笔记:select默认使用不当索引导致的巨大性能损失问题(二)
w
where
(start=1 and time between '2012-01-01 00:00:00' and '2012-01-01 23:59:59')
or
(end=1 and time between '2012-01-01 00:00:00' and '2012-01-01 23:59:59')
先不加force index,依然是坑爹的3s。 www.2cto.com
接着,加上force index
select sum(amount)
from flow force index (idx_start_time, idx_end_time)
where
(start=1 and time between '2012-01-01 00:00:00' and '2012-01-01 23:59:59')
or
(end=1 and time between '2012-01-01 00:00:00' and '2012-01-01 23:59:59')
见证奇迹的时刻到了,0.01s
这坑爹的MySQL在这个问题上终于被调教好了!
后记:
正如一开始提到的,我并没有很强的数据库知识和使用经验,所以上面提到的解法和观点很有可能是不精确甚至是错误的。虽然我最终看似得到了一些结论,但是产生这个问题的根本原因依然没有理解的十分透彻。进一步的分析可能需要对MySQL或其他类似关系型数据库的底层实现机制有一定的了解,对我而言这目前是一个彻底的空白。
我只能说, 对于MySQL,在有些情况下更改SQL语句的字面写法和强制指定索引真的是有可能起到奇效的。这并不只是理论上的可能性,而是实际工作学习中可能遇到的实实在在的问题。