MySQL优化一之limit优化

来源:互联网 发布:propolinse漱口水知乎 编辑:程序博客网 时间:2024/05/17 00:08

1.知识点

   limit的几种形式

   limit m,n 从m条后一条往后取n条数据,如0,10就是从第一条开始取10条数据。

   limit n  --> limit 0,n  --> limit 0 offset n

 

2.问题:

   我们都知道MySQL分页使用limit,是不是所有的分页我们都可以使用limit呢?

 

3.结论:

   当然不是啦,大表的时候limit 10000,10 的时候MYSQL会扫描满足条件的100010行然后取后面的10行,如果limit的这个值很大的话,当然扫描的行数就变多了,所以查询时间会变慢。

 

 4.优化 

    整个表的数据量在100W条左右。

 

    方法一:

    子查询

    从 SELECT * FROM `mytest`.`table_rm001` ORDER BY id DESC  LIMIT 100000,50;

    到 SELECT * FROM `mytest`.`table_rm001` where id >  (select id  from `mytest`.`table_rm001` order by id limit 100000,1) limit 50

 

    多次测试了下时间发现性能还是提高很多的。

    第一条SQL平均在400ms左右,第二条SQL平均在60ms左右。

 

    方法二:

    超过一半反向查找 

    正向查找: (当前页 – 1) * 页长度

  反向查找: 总记录 – 当前页 * 页长度 

 

 

 

 

 

 

Sql代码  收藏代码
  1. 建表语句:  
  2. CREATE TABLE `table_rm001` (  
  3.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  4.   `varcharvarchar(32) DEFAULT NULL,  
  5.   `tinyint` tinyint(4) DEFAULT NULL,  
  6.   `smallintsmallint(6) DEFAULT NULL,  
  7.   `mediumint` mediumint(9) DEFAULT NULL,  
  8.   `bigintbigint(20) DEFAULT NULL,  
  9.   `integerint(11) DEFAULT NULL,  
  10.   `floatfloat DEFAULT NULL,  
  11.   `realdouble DEFAULT NULL,  
  12.   `decimaldecimal(10,0) DEFAULT NULL,  
  13.   `boolean` tinyint(1) DEFAULT NULL,  
  14.   `datedate DEFAULT NULL,  
  15.   `datetime` datetime DEFAULT NULL,  
  16.   `timetime DEFAULT NULL,  
  17.   `yearyear(4) DEFAULT NULL,  
  18.   `text` text,  
  19.   `blob` blob,  
  20.   PRIMARY KEY (`id`),  
  21.   KEY `idx_float` (`float`),  
  22.   KEY `idx_varchar` (`varchar`)  
  23. ) ENGINE=MyISAM AUTO_INCREMENT=3000001 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT |  
0 0
原创粉丝点击