剛剛接觸mysql,希望把全表掃描給干掉,求指點,SQL執行計劃如下:
explain
SELECT * FROM sum_and_rate_22
RIGHT JOIN (
SELECT
MAX(created_at) AS created_at,
source_entity_name
FROM sum_and_rate_22
GROUP BY source_entity_name) AS temp
ON sum_and_rate_22.created_at = temp.created_at
AND sum_and_rate_22.source_entity_name = temp.source_entity_name;
uj5u.com熱心網友回復:
自己搶個沙發,這個是表結構:mysql> desc sum_and_rate_22;
+---------------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| source_entity_name | varchar(100) | NO | MUL | NULL | |
| source_count_rate | double | NO | | NULL | |
| source_bytes_rate | double | NO | | NULL | |
| source_count_sum | bigint(20) | NO | | NULL | |
| source_bytes_sum | bigint(20) | NO | | NULL | |
| source_collect_time | datetime | NO | | NULL | |
| sink_count_rate | double | NO | | NULL | |
| sink_bytes_rate | double | NO | | NULL | |
| sink_count_sum | bigint(20) | NO | | NULL | |
| sink_bytes_sum | bigint(20) | NO | | NULL | |
| sink_collect_time | datetime | NO | | NULL | |
| errq_count_sum | bigint(20) | NO | | NULL | |
| errq_bytes_sum | bigint(20) | NO | | NULL | |
| errq_collect_time | datetime | NO | | CURRENT_TIMESTAMP | |
| created_at | datetime | NO | MUL | CURRENT_TIMESTAMP | |
| created_by | int(11) | NO | | NULL | |
| updated_at | datetime | NO | | CURRENT_TIMESTAMP | |
| updated_by | int(11) | NO | | NULL | |
+---------------------+--------------+------+-----+-------------------+----------------+
uj5u.com熱心網友回復:
在source_entity_name,created_at上建立復合索引uj5u.com熱心網友回復:
mysql> alter table sum_and_rate_22 add index indx_union_created_source(created_at,source_entity_name);
Query OK, 0 rows affected, 1 warning (0.45 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> explain SELECT * FROM sum_and_rate_22
-> RIGHT JOIN (
-> SELECT
-> MAX(created_at) AS created_at,
-> source_entity_name
-> FROM sum_and_rate_22
-> GROUP BY source_entity_name) AS temp
-> ON sum_and_rate_22.created_at = temp.created_at
-> AND sum_and_rate_22.source_entity_name = temp.source_entity_name;

這個是目前資料庫里面有1w+ 的資料以后的結果,目前看來還是走的全表掃描,求指教。
uj5u.com熱心網友回復:
sum_and_rate_22 表沒有過濾條件(WHERE)又是RIGHT JOIN 肯定是要走全表掃描的
uj5u.com熱心網友回復:
SELECT * FROM sum_and_rate_22 全表掃描轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/89494.html
標籤:MySQL
上一篇:Mysql 陳述句執行順序疑問
下一篇:redis集群排序問題
