优化过程:

用的是两张表联查,四个条件like查询 ,根据时间排序降序

其中A,B表没有大字段,A表20万多数据,B表50万多条数据。语句如下:

EXPLAIN

SELECT A.bondId,A.sname,A.cname,A.secuCode,A. ISSUER,A.guarantor,B.underwriter AS infoSource

FROM   A

LEFT JOIN  B ON B.bondId = A.bondId

WHERE B.agentType = 1

AND B.underwriter = '简书有限公司'

AND A.startDate <= '2020-04-21 18:02:10'

AND A.endDate >= '2020-04-21 18:02:10'

AND (

A.cname LIKE '%简书%'  OR A.sname LIKE '%简书%'  OR A.secuCode LIKE '%简书%'

OR A. ISSUER LIKE '%简书%'OR A.guarantor LIKE '%简书%')

AND A.isValid = 1

ORDER BY A.startDate DESC

LIMIT 0, 20


可以看到B表用到了我们刚刚建的联合索引,并且额外信息是Using index ,type是ref级别的,效果比较理想,再来看A表。

Where条件中有多个like,这种情况下一般索引都是不可用的,所以必须用覆盖索引解决,

由于又根据startDate排序,所以尝试根据如下字段建立联合索引,同时查询的字段就是索引中的字段(startDate, endDate,cname, sname, secuCode, issuer, guarantor)


ALTER TABLE A ADD INDEX index_scssig(startDate, endDate,cname, sname, secuCode, issuer, guarantor)

再次explain看看效果: