SQL优化之多表关联查询-案例一

慢SQL日志里看到一个三张表的关联查询,如下:

SELECT COUNT(1) 
FROM refund_order_item i, artisan a, user u 
WHERE u.userid = i.user_id
	AND a.artisan_id = i.artisan_id;

测试查询时间:

mysql> SELECT COUNT(1) 
    -> FROM refund_order_item i, artisan a, user u 
    -> WHERE u.userid = i.user_id
    -> AND a.artisan_id = i.artisan_id;
+----------+
| COUNT(1) |
+----------+
|   260605 |
+----------+
1 row in set (2.30 sec)

查看执行计划:

mysql> explain SELECT COUNT(1) 
    -> FROM refund_order_item i, artisan a, user u 
    -> WHERE u.userid = i.user_id
    -> AND a.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 | Using index |
|  1 | SIMPLE      | u     | NULL       | eq_ref | userid                                    | userid    | 122      | hlj.i.user_id    |      1     |   100.00 | Using index |
+----+-------------+-------+------------+--------+----------------------------+---------+---------+------------------+--------+----------+-------------+

可以看到refund_order_item表没有走索引。

创建联合索引:

ALTER TABLE refund_order_item ADD INDEX idx_aid_uid (artisan_id, user_id);

查看执行计划:

explain SELECT COUNT(1)  FROM refund_order_item i, artisan a, user u  WHERE u.userid = i.user_id AND a.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 | Using index |
|  1 | SIMPLE      | a     | NULL       | eq_ref | PRIMARY                                           | PRIMARY     | 122     | hlj.i.artisan_id |      1 |   100.00 | Using index |
|  1 | SIMPLE      | u     | NULL       | eq_ref | userid                                                 | userid      | 122        | hlj.i.user_id    |      1 |   100.00 | Using index |
+----+-------------+-------+------------+--------+----------------------------------------+-------------+---------+------------------+--------+----------+-------------+

可以看到执行计划已经走索引。

测试查询时间:

mysql> SELECT COUNT(1) 
    -> FROM refund_order_item i, artisan a, user u 
    -> WHERE u.userid = i.user_id
    -> AND a.artisan_id = i.artisan_id;
+----------+
| COUNT(1) |
+----------+
|   260605 |
+----------+
1 row in set (1.15 sec)




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30135314/viewspace-2654178/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30135314/viewspace-2654178/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值