MySQL分页优化
关于数据库分页查询的话题,网上谈论的很多,但开发人员在使用上还是习惯以往的思路。 比如我们有个电话记录表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE `t_tel_record` ( `f_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '流水号', `f_qiye_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '企业', `f_callno` varchar(20) DEFAULT NULL COMMENT '主叫号码', `f_calltono` varchar(30) DEFAULT NULL COMMENT '被叫号码', `f_Starttime` datetime NOT NULL COMMENT '开始时间', `f_Endtime` datetime DEFAULT NULL COMMENT '结束时间', `f_Calltime` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT '通话时间', `f_user_id` bigint(20) NOT NULL COMMENT '员工用户', `f_path` varchar(200) DEFAULT NULL COMMENT '语音文件路径', `f_crm_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '客户库id', `f_call_type` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '0:未知,1:为呼入类型,2:呼出类型', PRIMARY KEY (`f_id`), KEY `idx_endtime_userid` (`f_Endtime`,`f_user_id`,`f_qiye_id`), KEY `idx_crmid` (`f_crm_id`), KEY `idx_qiye_user_calltime` (`f_qiye_id`,`f_Starttime`), KEY `idx_calltono` (`f_calltono`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 1 2 3 4 5 6 7 8 9 10 11 12 查询第1页的数据: SELECT * FROM t_tel_record WHERE f_qiye_id=xxx ORDER BY f_Starttime DESC LIMIT 0,100 当数据量很大,需要查询第10000页的数据: SELECT * FROM t_tel_record WHERE f_qiye_id=xxx ORDER BY f_Starttime DESC LIMIT 999900,100 -- 或者 OFFSET 999900 LIMIT 100 MySQL的 limit m,n 工作原理就是先读取符合where条件的前面m+n条记录,然后抛弃前m条,返回后面n条,所以m越大,偏移量越大,性能就越差。这也是大部分ORM框架生成的分页sql。 ...