0
以下查詢運行非常快,並立即MySQL服務器上:的MySQL索引 - 在主場迎戰的Equals索引問題
SELECT table_name.id
FROM table_name
WHERE table_name.id in (10000)
SELECT table_name.id
from table_name
where table_name.id = (SELECT table_name.id
FROM table_name
WHERE table_name.id in (10000)
);
但是,如果我改變了第二次查詢到如下的話,就需要超過20秒:
SELECT table_name.id
from table_name
where table_name.id in (SELECT table_name.id
FROM table_name
WHERE table_name.id in (10000)
);
在做解釋,我得到以下輸出。很明顯,關於MySQL如何索引數據並在關鍵字中使用,存在一些問題。
對於第一個查詢:
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | table_name | const | PRIMARY | PRIMARY | 4 | const | 1 | Using index |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
對於第二個查詢:
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | PRIMARY | table_name | const | PRIMARY | PRIMARY | 4 | const | 1 | Using index |
| 2 | SUBQUERY | table_name | const | PRIMARY | PRIMARY | 4 | | 1 | Using index |
+----+-------------+---------------+-------+---------------+---------+---------+-------+------+-------------+
對於第三個查詢:
+----+--------------------+------------+-------+---------------+---------+---------+-------+---------+--------------------------+
| id | select_type | table_name | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+------------+-------+---------------+---------+---------+-------+---------+--------------------------+
| 1 | PRIMARY | table_name | index | NULL | sentTo | 5 | NULL | 6250751 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | table_name | const | PRIMARY | PRIMARY | 4 | const | 1 | Using index |
+----+--------------------+------------+-------+---------------+---------+---------+-------+---------+--------------------------+
我使用InnoDB和試圖改變第三個查詢強行使用以下類別所示的索引。
第三個作爲相關子查詢運行,意味着子查詢針對父查詢的每行進行。如果您在該表中有1000條記錄,那麼您確實正在運行2000條查詢,並搜索了1,000,000行。 –
多數民衆贊成在你的外部SELECT中的'IN'條款的錯誤號碼3.任何機會,爲什麼你不使用這些「應該使用」聯接? – Najzero
您可以提供有關MySql版本的信息嗎?請在每次解釋之後再次運行解釋併發出'show warning'命令,如果得到任何結果,請附加到'show warnings'的問題結果。 – krokodilko