效率分析关键词:explain + SQL语句
一,最多见MYSQL最基本的分页方式limit:
mysql
select * from `table` order by id desc limit 0, 20在中小数据量的状况下,这样的SQL足够用了,惟一须要注意的问题就是确保使用了索引。随着数据量的增长,页数会愈来愈多,在数据慢慢增加的过程当中,可能就会出现limit 10000,20这样的状况,limit 10000,20的意思扫描知足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,若是是limit 100000,100,须要扫描100100行,在一个高并发的应用里,每次查询须要扫描超过10W行,性能确定大打折扣。
CREATE TABLE `td_skate` ( `valid` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '值id', `propertyid` BIGINT(20) NULL DEFAULT NULL COMMENT '属性id', `text` VARCHAR(400) NULL DEFAULT NULL, `entext` VARCHAR(400) NULL DEFAULT NULL, `picurl` VARCHAR(200) NULL DEFAULT NULL COMMENT '属性值说明图片,保存图片相对地址', `isother` BIGINT(20) NULL DEFAULT NULL COMMENT '是不是other值, 0 否 1 是', `createtime` DATETIME NULL DEFAULT NULL COMMENT '建立时间', `createuser` BIGINT(20) NULL DEFAULT NULL COMMENT '建立用户', `lastmodify` DATETIME NULL DEFAULT NULL COMMENT '最后修改时间', `updatetimeuser` BIGINT(20) NULL DEFAULT NULL COMMENT '最后修改人', `deletetime` DATETIME NULL DEFAULT NULL COMMENT '删除时间', `deleteuser` BIGINT(20) NULL DEFAULT NULL COMMENT '删除人', `description` VARCHAR(4000) NULL DEFAULT NULL COMMENT '产品描述', `isdelete` INT(11) NULL DEFAULT '0', PRIMARY KEY (`valid`), INDEX `fk_td_prodline_attrval_td_prodline_attr` (`propertyid`), CONSTRAINT `fk_td_prodline_attrval_td_prodline_attr` FOREIGN KEY (`propertyid`) REFERENCES `td_prodline_attr` (`propertyid`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=2491650;
SELECT * FROM `table` WHERE id <= (SELECT id FROM `table` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) ORDER BY id desc LIMIT $pagesize或者
select * FROM `table` AS t1 JOIN (SELECT id FROM `table` ORDER BY id desc LIMIT 900,1) AS t2 WHERE t1.id<=t2.id order by t1.id desc limit 5原理就是记录住当前页id的最大值和最小值,计算跳转页面和当前页相对偏移,因为页面相近,这个偏移量不会很大,这样的话m值相对较小,大大减小扫 描的行数。其实传统的limit m,n,相对的偏移一直是第一页,这样的话越翻到后面,效率越差,而上面给出的方法就没有这样的问题。
SELECT * FROM `table` WHERE id > 9527 ORDER BY id ASC LIMIT 20;处理”下一页”的时候SQL语句能够是:
SELECT * FROM `table` WHERE id < 9500 ORDER BY id DESC LIMIT 20;无论翻多少页,每次查询只扫描20行。
SELECT * FROM `table` WHERE id > 9527 ORDER BY id ASC LIMIT 20,20;跳转到第13页:
SELECT * FROM `table` WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;注意SQL语句里面的ASC和DESC,若是是ASC取出来的结果,显示的时候记得倒置一下。 总体来讲在面对百万级数据的时候若是使用上面第三种方法来优化,系统性能上是可以获得很好的提高,在遇到复杂的查询时也尽可能简化,减小运算量。 同时也尽可能多的使用内存缓存,有条件的能够考虑分表、分库、阵列之类的大型解决方案了。