ITPub博客

首页 > 数据库 > MySQL > SQL优化之limit分页(延迟关联)

SQL优化之limit分页(延迟关联)

原创 MySQL 作者:StevenBeijing 时间:2019-11-27 18:18:58 0 删除 编辑

       MySQL分页查询最头疼的问题是偏移量非常大,比如limit 10000,20,就要检索出10020条记录,值返回最后20条,前边的10000行全部抛弃掉。对于检索字段非常多的情况下,效率更为糟糕。

 SELECT
	id,
	order_seq,
	product_id,
	user_id,
	artisan_id,
	order_price,
	real_pay,
	date_format( order_time, '%Y-%m-%d %H:%i:%s' ) order_time,
	user_address,
	STATUS,
	date_format( pay_time, '%Y-%m-%d %H:%i:%s' ) pay_time,
	user_contact,
	coupon_price,
	coupon_effect_price,
	order_over_time,
	product_price,
	product_trade_price,
	source_from,
	create_time,
	out_channel
FROM
	us_order 
WHERE
 ( source_from != 20 OR source_from IS NULL ) 
	AND out_channel = 0 
ORDER BY
	id DESC 
	LIMIT 1000000,10

       例如这个SQL,耗时110s。我们需要检索出1000010条记录,然后取最后10条,包括近20个字段,对于IO的消耗是非常大的,与此同时,因为SQL执行时间较长,CPU时间占比也较高,在并发高的情况下,很可能出现CPU打满。

       对于这个SQL本身来说,偏移量1000000我们无法改变,那我们如何减少MySQL扫描的页来提高查询速度呢?

SELECT
	id,
	order_seq,
	product_id,
	user_id,
	artisan_id,
	order_price,
	real_pay,
	date_format( order_time, '%Y-%m-%d %H:%i:%s' ) order_time,
	user_address,
	STATUS,
	date_format( pay_time, '%Y-%m-%d %H:%i:%s' ) pay_time,
	user_contact,
	coupon_price,
	coupon_effect_price,
	order_over_time,
	product_price,
	product_trade_price,
	source_from,
	create_time,
	out_channel 
FROM
	us_order 
	inner join
	(select id from us_order where ( source_from != 20 OR source_from IS NULL ) AND out_channel = 0 ORDER BY id DESC LIMIT 1000000,10) as aa using(id)
WHERE
	( source_from != 20 OR source_from IS NULL ) 
	AND out_channel = 0 	

       通过“延迟关联”的方法,首先利用limit检索出所需要的id,然后通过id检索所需要的字段,大大减少了MySQL扫描的页面。耗时33s。



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30135314/viewspace-2665948/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-02-10

  • 博文量
    213
  • 访问量
    205420