多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### 延迟关联 mysql> select \* from it\_area where name like '%东山%'; +------+-----------+------+ | id | name | pid | +------+-----------+------+ | 757 | 东山区 | 751 | | 1322 | 东山县 | 1314 | | 2118 | 东山区 | 2116 | | 3358 | 东山区 | 3350 | +------+-----------+------+ 4 rows in set (0.00 sec) 分析: 这句话用到了索引覆盖没有? 答: 没有,1 查询了所有列, 没有哪个索引,覆盖了所有列. 2 like %xx%”,左右都是模糊查询, name本身,都没用上索引 #### 第2种做法: select a.* from it_area as a inner join (select id from it_area where name like '%东山%') as t on a.id=t.id; Show profiles; 查看效率: | 18 | 0.00183800 | select * from it_area where name like '%东山%' | 20 | 0.00169300 | select a.* from it_area as a inner join (select id from it_area where name like '%东山%') as t on a.id=t.id | 发现 第2种做法,虽然语句复杂,但速度却稍占优势. 第2种做法中, 内层查询,只沿着name索引层顺序走, name索引层包含了id值的. 所以,走完索引层之后,找到所有合适的id, 再通过join, 用id一次性查出所有列. 走完name列再取. 第1种做法: 沿着name的索引文件走, 走到满足的条件的索引,就取出其id, 并通过id去取数据, 边走边取. 通过id查找行的过程被延后了. --- 这种技巧,称为”延迟关联”.