SQL优化之多表关联查询-案例一
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,慢SQL日志里看到一个三张表的关联查询,如下:SELECT COUNT(1) FROM refund_order_item i, artisan a, user u WHERE u.userid =
千家信息网最后更新 2025年01月21日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)
查询
索引
时间
测试
关联
日志
联合
案例
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
质量过硬的软件开发
软件开发中数据设计作用
android软件开发it技术
数据库恢复机制与技术
修改数据库锁
生活中网络安全有那些
创建阿里云云服务器ecs
微搭数据库
服务器被黑客创建
红色报刊档案数据库账户
图书读者借阅数据库数据查询
怎么往数据库表中加入数据
福州公司软件开发
高考数据库泄漏
魔兽世界大服务器和跨服区别
网络安全教育400
怎么暂停电脑数据库服务
linux服务器时间跟主板时间
建立劳务价格数据库的意义
湖州银行软件开发薪酬待遇
软件开发外包报价方案
软件开发公司杭州有吗
纵论网络安全
安卓一体机 服务器
数据库实现循环
河南服务器防火墙品牌
网络安全评测工程师试题
数据库技术参考书
虎丘区第三方网络技术哪个好
《思科网络技术学院》