从上面的例子可以看出,第一个SQL语句需要进行"filesort",而第二个SQL由于order by null 不需要进行 "filesort", 而上文提过Filesort往往非常耗费时间。
limit优化一般分页查询时,通过创建覆盖索引能够比较好地提高性能。一个常见又非常头疼的问题就是 limit 5000000,10 ,此时需要MySQL排序前5000010 记录,仅仅返回5000000 - 5000010 的记录,其他记录丢弃,查询排序的代价非常大 。
limit分页操作, 越往后, 性能越低
优化方案:
--可以通过只查主键,再通过关联主键查询结果再查询出具体行数据 select * from tb_sku t , (select id from tb_sku order by id limit 9000000,1) a where t.id = a.id; count优化在很多的业务系统中,都需要考虑进行分页操作,但是当我们执行分页操作时,都需要进行一次count操作,求取总记录数,如果数据库表的数据量大,在InnoDB引擎中,执行count操作的性能是比较低的,需要遍历全表数据,对计数进行累加。
优化方案:
①. 在大数据量的查询中,只查询数据, 而不展示总记录数 ;
②. 通过缓存redis维护一个表的计数,来记录数据库表的总记录数,在执行插入/删除时,需要动态更新;但是这种带where条件的就没法子了。
③. 在数据库表中定义一个大数据量的计数表,在执行插入/删除时,需要动态更新。同上一样无法带where条件。