Mysql 分頁效率不同的SQL

dimen007發表於2011-06-24

在網上看到兩個查詢語句,引擎INNODB,版本Mysql 5.0 .

 

    Common Query 1:

       SELECT * FROM task_condition_0

WHERE uid <= 110402840 AND (Tc_ID<79777 or UID<1104028400) limit 6;

Better Query 2:

SELECT A2.* FROM task_condition_0 A1  INNER JOIN task_condition_0 A2 ON A1.TC_id=A2.TC_id

WHERE A1.uid <= 110402840 AND (A1.Tc_ID<79777 or A1.UID<1104028400) limit 6;

 

經過優化器得到一樣結果的另外一種寫法:

SELECT A1.* FROM task_condition_0 A1 INNER JOIN (SELECT TC_ID FROM task_condition_0 WHERE uid <= 110402840 AND (Tc_ID<79777 or UID<1104028400) ORDER BY UID,TC_ID limit 6) A2

ON A1.TC_id=A2.TC_id ;

 

EXPLAIN  1

| id | select_type | table              | type  | possible_keys           | key              | key_len | ref  | rows   | Extra        |

+----+-------------+------------------+-------+------------------------+----------------+---------+------+-------+-------------+

|  1 | SIMPLE       | task_condition_0 | range | PRIMARY,index_uid_tcid | index_uid_tcid | 11       | NULL | 20390 | Using where |

 

EXPLAIN 2

| id | select_type | table | type    | possible_keys           | key             | key_len  | ref           | rows  | Extra                       |

+----+-------------+-------+--------+-------------------- ---+----------------+---------+--------------+-------+--------------------------+

|  1 | SIMPLE       | A1     | range  | PRIMARY,index_uid_tcid | index_uid_tcid | 11       | NULL          | 20390 | Using where; Using index |

|  1 | SIMPLE       | A2     | eq_ref | PRIMARY                  | PRIMARY         | 4        | tmp.A1.TC_ID |      1 |                              |

 

實際上以上兩個都只掃描rows=6.

 

檢視邏輯讀Innodb_buffer_pool_read_requests

1 221736008-221735923=85

2 221736074-221736008=66

明顯我們看到的第二個語句比第一個語句效率要高。

因為什麼呢 ?

SQL1使用Second index排序---&gt取到所有行---&gt進行limit---&gt最後獲得所需的資料行

    SQL2使用Second index排序---&gt只取到主鍵值,不需要取所有行---&gt進行limit---&gt通過與全表進行主鍵關聯。
    
    在偏移量大的時候,效率比SQL1更明顯。

    如有不同意見,歡迎提意見。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12309491/viewspace-700666/,如需轉載,請註明出處,否則將追究法律責任。

相關文章