Mysql 查詢分頁優化

全表掃描,速度極慢

  • limit 語句的查詢時間與起始記錄的位置成正比
  • MySQL 的 limit 語句是很方便,可是對記錄不少的表並不適合直接使用
     
    建立測試表:
    DROP TABLE IF EXISTS `t_user`;
    CREATE TABLE `test`.`t_user`( 
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(200) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`)
    );
# 經常使用的分頁查詢SQL
    SELECT id,`username` FROM t_user LIMIT 100,100;
    SELECT id,`username` FROM t_user LIMIT 10000,100;
    SELECT id,`username` FROM t_user LIMIT 1000000,100;
    SELECT id,`username` FROM t_user LIMIT 5000000,100;

執行結果:
Mysql 查詢分頁優化sql

分析結論ide

  • 全表掃描,速度極慢
    limit 語句的查詢時間與起始記錄的位置成正比
    MySQL 的 limit 語句是很方便,可是對記錄不少的表並不適合直接使用

優化辦法(一)
利用主鍵索引來加速分頁查詢測試

SELECT * FROM t_user WHERE id > 1000000 LIMIT 100;
SELECT * FROM t_user WHERE id > 1000000 AND id <= 5000000+100;

分析結果:
Mysql 查詢分頁優化優化

分析語句執行:code

EXPLAIN SELECT id,`name` FROM t_test LIMIT 1000000,100;
EXPLAIN SELECT * FROM t_user WHERE id > 1000000 LIMIT 100;
EXPLAIN SELECT * FROM t_user WHERE id > 1000000 AND id <= 5000000+100;

結果
Mysql 查詢分頁優化
 blog

若是主鍵值不連續,該怎麼分頁?

  • 使用邏輯刪除,不會形成主鍵不連續
    使用上面的優化方式便可索引

    SELECT * FROM t_user WHERE id > 1000000 LIMIT 100;
    SELECT * FROM t_user WHERE id > 1000000 AND id <= 5000000+100;
  • 利用主鍵索引加速,再作錶鏈接查詢
    SELECT 
    t.id,
    t.name,
    FROM
    t_user AS t 
    JOIN 
    (SELECT 
      id 
    FROM
      t_user 
    LIMIT 1000000, 100) tmp 
    ON t.id = tmp.id ;

執行結果對比
Mysql 查詢分頁優化it

Mysql 查詢分頁優化

相關文章
相關標籤/搜索