天天看點

Mysql Limit 調優

  1. 建表與插入資料
  2. SQL對比

1. 基本資料

  • 建立表

CREATE TABLE student

 (

  id  int(10) NOT NULL AUTO_INCREMENT,

  name varchar(25) DEFAULT NULL,

  age tinyint(2) DEFAULT NULL,

  live varchar(255) DEFAULT NULL,

  PRIMARY KEY (id)

 ) ;

  • 批量插入1百萬條資料

DROP PROCEDURE IF EXISTS insert_Stu;

DELIMITER $$

CREATE PROCEDURE insert_Stu(IN max_num INT(10))

BEGIN

 DECLARE i INT DEFAULT 0;

 REPEAT

  SET i = i + 1;

  INSERT INTO student (name, age, live) VALUES (rand_string(3), rand_num(), rand_string(6));

 UNTIL i = max_num

  END REPEAT;

 COMMIT;

END $$

DROP PROCEDURE IF EXISTS rand_string;

CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)

 DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';

 DECLARE return_str VARCHAR(255) DEFAULT '';

 WHILE i < n DO

 SET return_str = CONCAT(return_str, SUBSTRING(chars_str, FLOOR(1 + RAND() * 52), 1));

 SET i = i + 1;

 END WHILE;

 RETURN return_str;

END $$;

DROP PROCEDURE IF EXISTS rand_num;

CREATE FUNCTION rand_num()

 RETURNS INT(5)

 SET i = FLOOR(100 + RAND() * 10);

 RETURN i;

;

call insert_Stu(1000000);

2. SQL對比

  1. 正常分頁

 select s.* from student s limit 1000000,10;

  1. 優化分頁

 select s.*

 from student s

 WHERE s.id >= (SELECT s.id FROM student LIMIT 1000000, 1)

 LIMIT 10;

  1. 最優分頁

 SELECT s.* FROM student s WHERE s.id BETWEEN 1000000 AND 1000010;

性能對比圖

可以看到三種SQL的耗時 ,為什麼會有這麼大的差距,這主要是MySQL的limit關鍵字會導緻偏移量的原因

Mysql Limit 調優