当前位置: 代码迷 >> MySQL >> MySQL优化1之limit优化
  详细解决方案

MySQL优化1之limit优化

热度:113   发布时间:2016-05-05 17:05:56.0
MySQL优化一之limit优化

?

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 |

?

  相关解决方案