求教!mysql千万级数据多表查询做分页该如何优化?

「已注销」 2014-02-20 04:17:05
现有一日志表,数据增长到了千万级,查询分页到后面几页会非常慢,想做下优化,可不知如何下手,甚是困顿啊!

表结构与查询语句如下,做了下简化:

-- 主要log表 无连续性增长字段
CREATE TABLE `data_log` (
`uniqueid` varchar(20) NOT NULL,
`lead_id` int(9) unsigned NOT NULL,
`event_time` datetime DEFAULT NULL,
`length_in_sec` int(10) DEFAULT NULL,
`status` varchar(6) DEFAULT NULL,
`user` varchar(20) DEFAULT NULL,
`comments` varchar(36) DEFAULT 'AUTO',
PRIMARY KEY (`uniqueid`),
KEY `lead_id` (`lead_id`),
KEY `event_time` (`call_date`),
KEY `status` (`status`),
KEY `user` (`user`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `data_users` (
`user_id` int(9) unsigned NOT NULL AUTO_INCREMENT,
`user` varchar(20) NOT NULL,
`pass` varchar(20) NOT NULL,
`full_name` varchar(50) DEFAULT NULL,
`user_level` tinyint(2) DEFAULT '1',
`user_group` varchar(20) DEFAULT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `user` (`user`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8


CREATE TABLE `data_status` (
`status` varchar(20) NOT NULL,
`status_name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


mysql> EXPLAIN
-> select a.lead_id,a.call_date,a.user,b.full_name,a.status,c.status_name from data_log a
-> left join data_users b on a.user=b.user
-> left join data_status c on a.status=c.status
-> where a.event_time BETWEEN '2014-02-12 10:00:01' and '2014-02-12 23:00:01'
-> and a.status='NA' order by a.event_time desc limit 10000,10050;



请各位帮想个法子可以优化下 多表联合查询的分页,多谢!








...全文
401 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wutuobang321 2014-02-21
  • 打赏
  • 举报
回复
引用 2 楼 sea267 的回复:
[quote=引用 1 楼 wutuobang321 的回复:] order by a.event_time 就需要在event_time字段上也建立一个索引
哈,不好意思,索引已经加了, KEY `event_time` (`event_time`) 我问题中写错名字了!~[/quote] 相对来说,我对InnoDB比较熟悉,InnoDB优化的话需要将结果集小的放在前面,MyISAM不太了解,看看MyISAM关于Join的优化吧。。。
「已注销」 2014-02-21
  • 打赏
  • 举报
回复
引用 1 楼 wutuobang321 的回复:
order by a.event_time 就需要在event_time字段上也建立一个索引
哈,不好意思,索引已经加了, KEY `event_time` (`event_time`) 我问题中写错名字了!~
「已注销」 2014-02-21
  • 打赏
  • 举报
回复
引用 4 楼 iihero 的回复:
似乎索引也都加上了。 要不,对A表:a.event_time BETWEEN '2014-02-12 10:00:01' and '2014-02-12 23:00:01' -> and a.status='NA' 子查询一下弄成子表,再join试试?
谢谢版主了 。主要是子查询如果结果集很庞大的话还是比较慢 哎 很愁人 我试试吧!~
iihero_ 2014-02-21
  • 打赏
  • 举报
回复
似乎索引也都加上了。 要不,对A表:a.event_time BETWEEN '2014-02-12 10:00:01' and '2014-02-12 23:00:01' -> and a.status='NA' 子查询一下弄成子表,再join试试?
wutuobang321 2014-02-20
  • 打赏
  • 举报
回复
order by a.event_time 就需要在event_time字段上也建立一个索引

56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧