优化过程:
用的是两张表联查,四个条件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看看效果: