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高效率的分頁查詢MySql
- jdon 的分頁機制的效率低,
- MySQL、Oracle和SQL Server的分頁查詢語句MySqlOracleServer
- mysql分頁-limit offset分頁MySqlMIT
- MySQL的分頁查詢MySql
- mysql查詢效率慢的SQL語句MySql
- 分頁實現前臺後臺不同效果,分頁類引入
- SQL資料分頁SQL
- SQL分頁語句SQL
- 分頁procedure (SQL Server)SQLServer
- Linq to sql 分頁SQL
- mysql分頁時offset過大的Sql最佳化經驗分享MySql
- 優化MySQL中的分頁優化MySql
- 優化 MySQL 中的分頁優化MySql
- 在mysql查詢效率慢的SQL語句MySql
- Oracle環境下SQL語句的不同寫法效率對比OracleSQL
- MySQL、Elasticsearch 深度分頁MySqlElasticsearch
- [SQL Server]分頁功能的實現SQLServer
- MySQL與SQL的觸發器的不同寫法MySql觸發器
- 三種SQL分頁方式SQL
- MySql定位執行效率較低的SQL語句MySql
- FluentData Mysql分頁的一個BUGMySql
- MySQL的分頁技術總結MySql
- PHP+MYSQL的分頁實作PHPMySql
- SQL Server的分頁優化及Row_Number()分頁存在的問題SQLServer優化
- mysql實戰--MYSQL中的SQL分組方法MySql
- (SQL Server)分頁的儲存過程SQLServer儲存過程
- mysql 使用技巧 分頁limitMySqlMIT
- excel匯出、mysql分頁ExcelMySql
- MySQL 多表查詢分頁MySql
- mySql\oracle分頁機制MySqlOracle
- Oracle rownum 分頁引起的效率問題及優化思路Oracle優化
- Mysql 分組排序的sql寫法MySql排序
- 實現不同頁面不同頁首
- mybatis動態sql與分頁MyBatisSQL
- SQL 分頁儲存過程SQL儲存過程
- SQL - 常用資料庫分頁SQL資料庫