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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL多表關聯查詢MySql
- JPA多表關聯查詢
- JPA 之 多表聯合查詢
- mysql關聯查詢優化MySql優化
- 如何做多表關聯查詢
- mysql中的多表關聯查詢MySql
- thinkphp中的多表關聯查詢PHP
- Mybatis【15】-- Mybatis一對一多表關聯查詢MyBatis
- MyBatisPlus怎麼多表關聯查詢?MyBatis
- 多表聯合查詢 - 基於註解SQLSQL
- SQL Server 多表聯合查詢取最新一條資料SQLServer
- 十七、Mysql之SQL優化查詢MySql優化
- onethinkphp 如何做多表關聯查詢PHP
- thinkPHP多表聯合查詢PHP
- 深入sql多表差異化聯合查詢的問題詳解SQL
- SQL查詢的:子查詢和多表查詢SQL
- Mybatis 多表關聯查詢(1) one-to-one關係MyBatis
- SQL查詢優化SQL優化
- Spring Data JPA 實現多表關聯查詢Spring
- MS SQL SERVER索引優化相關查詢SQLServer索引優化
- jpa動態查詢與多表聯合查詢
- 優化sql查詢速度優化SQL
- 多表關聯查詢中,關聯欄位都應該建立索引嗎?索引
- 《MySQL慢查詢優化》之SQL語句及索引優化MySql優化索引
- 效能為王:SQL標量子查詢的優化案例分析SQL優化
- pgsql查詢優化之模糊查詢SQL優化
- SQL三表左關聯查詢SQL
- 兩表關聯查詢:sql、mybatisSQLMyBatis
- SQL Server 查詢優化功能SQLServer優化
- SQL查詢優化的方法SQL優化
- 優化sql提高查詢速度優化SQL
- MySQL exists關聯子查詢SQL效能及其低下最佳化之等值子查詢轉換MySql
- Sql Server系列:多表連線查詢SQLServer
- SQL複雜查詢多表連線SQL
- 關於關聯查詢sql的一次最佳化過程及其他SQL
- Oracle效能優化-SQL優化(案例一)Oracle優化SQL
- MySQL SQL優化案例(一)MySql優化
- mybatis多表聯合查詢的寫法MyBatis