强制索引,即指定本次查询使用某个特定的索引,这样就可避免MySQL优化器使用低效的索引。

应用场景

当前需要统计当天用户的充值排行榜,这里就需要统计当天时间每一个独立用户充值的总金额,这里用到的索引是用户id(int类型)以及充值时间(timestamp类型),SQL语句如下:

SELECT userid, SUM(money) AS money FROM `pay` WHERE userid > 100 AND updatetime >= 'xxxx-xx-xx xx:xx:xx' AND updatetime <= 'xxxx-xx-xx xx:xx:xx' GROUP BY userid

上面的语句看似没啥问题,其实的确也没问题,但是就是查询时间太长了,每执行一次都要等很久。问了一下,原来MySQL执行的时候优先使用了int类型的userid这个索引,而userid这个查询只有下界,没有上界,这里面需要查询的数据量就很大了。这个时候就轮到我们的主角FORCE INDEX 出马了,强制MySQL使用updatetime这个索引,语句如下:

SELECT userid, SUM(money) AS money FROM `pay` FORCE INDEX(updatetime) WHERE userid > 100 AND updatetime >= 'xxxx-xx-xx xx:xx:xx' AND updatetime <= 'xxxx-xx-xx xx:xx:xx' GROUP BY userid

试着去执行了一下,果然, 查询速度立马变快了,这里要感谢带我的老司机,是他告诉了我这个方法。老司机果然就是不同凡响,一上来就搞定了,牛逼。

发表新评论