Mysql 分頁效率不同的SQL
在網上看到兩個查詢語句,引擎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排序--->取到所有行--->進行limit--->最後獲得所需的資料行
SQL2使用Second index排序--->只取到主鍵值,不需要取所有行--->進行limit--->通過與全表進行主鍵關聯。來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12309491/viewspace-700666/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySql/Oracle和SQL Server的分頁查MySqlOracleServer
- mysql分頁-limit offset分頁MySqlMIT
- mysql查詢效率慢的SQL語句MySql
- 在mysql查詢效率慢的SQL語句MySql
- mysql分頁時offset過大的Sql最佳化經驗分享MySql
- MySQL的分頁查詢MySql
- MySQL與SQL的觸發器的不同寫法MySql觸發器
- 分頁實現前臺後臺不同效果,分頁類引入
- MySQL分頁查詢offset過大,Sql最佳化經驗MySql
- Mysql 分組排序的sql寫法MySql排序
- MySQL、Elasticsearch 深度分頁MySqlElasticsearch
- SQL 分頁儲存過程SQL儲存過程
- mybatis動態sql與分頁MyBatisSQL
- MySQL最佳化之如何查詢SQL效率低的原因MySql
- excel匯出、mysql分頁ExcelMySql
- mysql 使用技巧 分頁limitMySqlMIT
- 實現不同頁面不同頁首
- 統計分頁一些sqlSQL
- 動態SQL-條件分頁SQL
- MySQL分頁查詢優化MySql優化
- List分頁(SQL引數化2100個 )SQL
- MySQL寫sql的21個好習慣,讓你的工作效率翻倍MySql
- MySQL寫sql的21個好習慣,學習工作效率翻倍MySql
- 查詢效率提升10倍!3種優化方案,幫你解決MySQL深分頁問題優化MySql
- PHP 原生操作 Mysql 分頁資料案例PHPMySql
- MySQL分優化之超大頁查詢MySql優化
- (MySQL學習筆記)分頁查詢MySql筆記
- SQL 搜尋方法或鍵集分頁 - Vlad MihalceaSQL
- 淺析Oracle(rownum)和Mysql(limit)分頁的區別OracleMySqlMIT
- MySQL全面瓦解9:查詢的排序、分頁相關MySql排序
- SQL優化案例-單表分頁語句的優化(八)SQL優化
- 根據使用者的不同登入不同的頁面
- SQL -去重Group by 和Distinct的效率SQL
- mysql基礎複習(SQL語句的四個分類),MySql
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- 24-PHP+MySQL分頁技術詳解PHPMySql
- 資料庫系列:MySQL不同操作分別用什麼鎖?資料庫MySql
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- 基於Sql server資料庫的四種分頁方式總結SQLServer資料庫