2014-03-03 80 views
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和試圖改變第三個查詢強行使用以下類別所示的索引。

+0

第三個作爲相關子查詢運行,意味着子查詢針對父查詢的每行進行。如果您在該表中有1000條記錄,那麼您確實正在運行2000條查詢,並搜索了1,000,000行。 –

+0

多數民衆贊成在你的外部SELECT中的'IN'條款的錯誤號碼3.任何機會,爲什麼你不使用這些「應該使用」聯接? – Najzero

+0

您可以提供有關MySql版本的信息嗎?請在每次解釋之後再次運行解釋併發出'show warning'命令,如果得到任何結果,請附加到'show warnings'的問題結果。 – krokodilko

回答

0

在第一種情況下,你必須從子查詢中只有第一個記錄(它運行一次,因爲相當於只對第一個值)

在第二個查詢你有笛卡爾乘積(每按每個),因爲在運行的每一行子查詢。這對性能不利

嘗試對這些情況使用連接。