SQL优化之多表关联查询-案例一
慢SQL日志里看到一个三张表的关联查询,如下:
SELECTCOUNT(1)FROMrefund_order_itemi,artisana,useruWHEREu.userid=i.user_idANDa.artisan_id=i.artisan_id;
测试查询时间:
mysql>SELECTCOUNT(1)->FROMrefund_order_itemi,artisana,useru->WHEREu.userid=i.user_id->ANDa.artisan_id=i.artisan_id;+----------+|COUNT(1)|+----------+|260605|+----------+1rowinset(2.30sec)
查看执行计划:
mysql>explainSELECTCOUNT(1)->FROMrefund_order_itemi,artisana,useru->WHEREu.userid=i.user_id->ANDa.artisan_id=i.artisan_id;+----+-------------+-------+------------+--------+----------------------------+---------+---------+------------------+--------+----------+-------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+--------+----------------------------+---------+---------+------------------+--------+----------+-------------+|1|SIMPLE|i|NULL|ALL|idx_user_id,idx_artisan_id|NULL|NULL|NULL|255599|100.00|NULL||1|SIMPLE|a|NULL|eq_ref|PRIMARY|PRIMARY|122|hlj.i.artisan_id|1|100.00|Usingindex||1|SIMPLE|u|NULL|eq_ref|userid|userid|122|hlj.i.user_id|1|100.00|Usingindex|+----+-------------+-------+------------+--------+----------------------------+---------+---------+------------------+--------+----------+-------------+
可以看到refund_order_item表没有走索引。
创建联合索引:
ALTERTABLErefund_order_itemADDINDEXidx_aid_uid(artisan_id,user_id);
查看执行计划:
explainSELECTCOUNT(1)FROMrefund_order_itemi,artisana,useruWHEREu.userid=i.user_idANDa.artisan_id=i.artisan_id;+----+-------------+-------+------------+--------+----------------------------------------+-------------+---------+------------------+--------+----------+-------------+|id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|+----+-------------+-------+------------+--------+----------------------------------------+-------------+---------+------------------+--------+----------+-------------+|1|SIMPLE|i|NULL|index|idx_user_id,idx_artisan_id,idx_aid_uid|idx_aid_uid|244|NULL|255599|100.00|Usingindex||1|SIMPLE|a|NULL|eq_ref|PRIMARY|PRIMARY|122|hlj.i.artisan_id|1|100.00|Usingindex||1|SIMPLE|u|NULL|eq_ref|userid|userid|122|hlj.i.user_id|1|100.00|Usingindex|+----+-------------+-------+------------+--------+----------------------------------------+-------------+---------+------------------+--------+----------+-------------+
可以看到执行计划已经走索引。
测试查询时间:
mysql>SELECTCOUNT(1)->FROMrefund_order_itemi,artisana,useru->WHEREu.userid=i.user_id->ANDa.artisan_id=i.artisan_id;+----------+|COUNT(1)|+----------+|260605|+----------+1rowinset(1.15sec)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。