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) * 页长度
反向查找: 总记录 – 当前页 * 页长度建表语句: CREATE TABLE `table_rm001` ( `id` int(11) NOT NULL AUTO_INCREMENT, `varchar` varchar(32) DEFAULT NULL, `tinyint` tinyint(4) DEFAULT NULL, `smallint` smallint(6) DEFAULT NULL, `mediumint` mediumint(9) DEFAULT NULL, `bigint` bigint(20) DEFAULT NULL, `integer` int(11) DEFAULT NULL, `float` float DEFAULT NULL, `real` double DEFAULT NULL, `decimal` decimal(10,0) DEFAULT NULL, `boolean` tinyint(1) DEFAULT NULL, `date` date DEFAULT NULL, `datetime` datetime DEFAULT NULL, `time` time DEFAULT NULL, `year` year(4) DEFAULT NULL, `text` text, `blob` blob, PRIMARY KEY (`id`), KEY `idx_float` (`float`), KEY `idx_varchar` (`varchar`) ) ENGINE=MyISAM AUTO_INCREMENT=3000001 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT |