今天在做一个业务逻辑的时候,觉得写出来的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。