MySQL原理与优化Limit查询优化

有人去过北京中科医院 http://baidianfeng.39.net/a_zzzl/170125/5212076.html

假设有表tb_sku,其表结构如下。

表中大约有w条记录,执行如下的sql语句大约4.36s返回数据

selectcount(*)fromtb_sku;

接着我们使用对其进行分页查询:

select*fromtb_skulimit0,10;

limit语句其中0代表起始位置,10为每页返回的数据数量。

如上图所示,很快就返回了查询结果。

接着我们再使用SQL语句

select*fromtb_skulimit10,10;

语句从记录位置10的位置开始再往下返回10条记录,也就是第二页的信息。其返回时间也是比较快。

然后,我们加大起始位置到w如下,

select*fromtb_skulimit0000,10;

此时返回时间需要0.74s,这说明了使用limit对大数据量的表进行分页,位置越靠后效率越低。拿上面的例子来说,limit会先对w的数据进行排序,然后再返回10条数据,而且仅仅返回w到w零10条的记录,其他查询的记录都会丢弃掉,这种做法查询排序的代价非常大。

由此我们需要对大数据量表进行limit操作进行优化,官方给出的方案是通过覆盖索引和子查询的方式进行优化

根据这个思路首先对id进行查询

selectidfromtb_skuorderbyidlimit0000,10;

查询结果就只需要0.34s比之前的0.74s要快多了。究其原因,因为直接返回id的信息,并没有进行回表操作,所以速度别select*要快

由于我们需要获得select*的信息,也就是tb_user所有字段的信息,因此需要将上面的查询结果和tb_user进行jion操作。

selects.*fromtb_skus,(selectidfromtb_skuorderbyidlimit0000,10)twheres.id=t.id;

这里通过查询id和子查询的方式将查询结果缩短为0.38s,比之前直接通过select*的方式要缩短一倍的查询时间。




转载请注明:http://www.aierlanlan.com/rzdk/2257.html