MYSQL优化-EXPLAIN的使用

37 阅读1分钟

今天在做一个业务逻辑的时候,觉得写出来的sql语句有点慢,所以就想着用explain来优化一下。 优化之前的sql语句--时间:1.118s

EXPLAIN SELECT
	`a`.*,
	`b`.`ascription_school`,
	`team_name`,
	`c`.`pname` 
FROM
	`as_market_meeting_sign_in` `a`
	LEFT JOIN `as_sc_position_market` `b` ON `a`.`usercard` = `b`.`usercard`
	LEFT JOIN `as_sc_position_market_history` `c` ON `a`.`usercard` = c.usercard 
	AND c.YEAR = LEFT ( a.createtime, 4 ) 
	AND c.MONTH = SUBSTRING( a.createtime, 6, 2 ) 
WHERE
	`meet_id` = 207 
ORDER BY
	`a`.`id` DESC
	LIMIT 0,
	10;

可以看到第三行type类型为ALL,那么够优化的就需要根据这个来进行优化。这个的意思就是说c表进行的是全表扫描,我们可以对其进行优化。使c表中的字段使用索引,我们已经知道c表中有一个联合索引market_id_year_month。 也就说使用left左连接的时候,根据索引的最左前缀原则, 使用market_id作为on的条件进行关联。

优化以后的sql语句是--时间:0.008s

EXPLAIN SELECT
	`a`.*,
	`b`.`ascription_school`,
	`team_name`,
	`c`.`pname` 
FROM
	`as_market_meeting_sign_in` `a`
	LEFT JOIN `as_sc_position_market` `b` ON `a`.`usercard` = `b`.`usercard`
	LEFT JOIN `as_sc_position_market_history` `c` ON `b`.`id` = c.market_id 
	AND c.YEAR = LEFT ( a.createtime, 4 ) 
	AND c.MONTH = SUBSTRING( a.createtime, 6, 2 ) 
WHERE
	`meet_id` = 207 
ORDER BY
	`a`.`id` DESC 
	LIMIT 0,
	10;

可以看到rows的扫描行由20多万行变成一行,这样就优化了sql。