0 0

从500万条数据中查询,求优化一条SQL语句10

表结构如下,里面有500W数据。我没有权限修改这个表,所以请大家给我优化下SQL查询
CREATE TABLE IF NOT EXISTS `jdp_tb_trade` (
  `tid` bigint(20) NOT NULL,
  `status` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `seller_nick` varchar(32) DEFAULT NULL,
  `buyer_nick` varchar(32) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  `jdp_hashcode` varchar(128) DEFAULT NULL,
  `jdp_response` mediumtext,
  `jdp_created` datetime DEFAULT NULL,
  `jdp_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`tid`),
  KEY `ind_jdp_tb_trade_seller_nick_jdp_modified` (`seller_nick`,`jdp_modified`),
  KEY `ind_jdp_tb_trade_jdp_modified` (`jdp_modified`),
  KEY `ind_jdp_tb_trade_seller_nick_modified` (`seller_nick`,`modified`),
  KEY `ind_jdp_tb_trade_modified` (`modified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


符合以下条件的有3W条数据
SELECT COUNT(*) AS tp_count FROM `jdp_tb_trade` WHERE ( `seller_nick` IN ('李心','zhixian50','陈鹏','雪儿','稀饭','婷婷','七七') ) AND ( (`jdp_modified` > '2007-11-30 09:52:39') AND (`jdp_modified` <= '2014-04-21 22:31:13')  ) LIMIT 1


我要分页查询出这3W条数据,由于MYSQL分页越往后查询越慢,所以我用了关联查询。该查询在前面2页需要3到4分钟才能返回结果。后面的每页4秒左右就返回了。实在搞不明白为什么。麻烦大家帮忙优化下。每页必须要在10秒内完成。
SELECT  t1.jdp_modified,t1.jdp_response FROM jdp_tb_trade t1, ( SELECT `tid` FROM `jdp_tb_trade` WHERE ( `seller_nick` IN ('李心','zhixian50','陈鹏','雪儿','稀饭','婷婷','七七') ) AND ( (`jdp_modified` > '2007-11-30 09:52:39') AND (`jdp_modified` <= '2014-04-21 22:31:13')  ) ORDER BY jdp_modified desc LIMIT 0,200   ) t2 WHERE t1.tid=t2.tid

问题补充:慢的原因主要在in上面,目前我将in用UNION ALL代替,能基本达到要求。各位还有什么好方法
2014年4月22日 17:17

12个答案 按时间排序 按投票排序

0 0

采纳的答案

SELECT * FROM (
SELECT  t1.tid FROM jdp_tb_trade t1
where t1.seller_nick IN ('李心','zhixian50','陈鹏','雪儿','稀饭','婷婷','七七')
and t1.jdp_modified > '2007-11-30 09:52:39'
and t1.jdp_modified <= '2014-04-21 22:31:13'
ORDER BY jdp_modified desc
LIMIT 0,200 ) a inner join jdp_tb_trade b on a.tid = b.tid

给你些参考链接,希望有所帮助:
http://laiguowei2004.blog.163.com/blog/static/36829000201162765456254/
http://www.111cn.net/database/mysql/50921.htm

2014年4月23日 11:18
0 0

数据多还是得用索引

2014年4月26日 00:52
0 0

SELECT  jdp_modified,jdp_response FROM jdp_tb_trade WHERE tid IN (select tid FROM jdp_tb_trade  WHERE `seller_nick` IN ('李心','zhixian50','陈鹏','雪儿','稀饭','婷婷','七七') 
AND `jdp_modified` > '2007-11-30 09:52:39' 
AND `jdp_modified` <= '2014-04-21 22:31:13' 
ORDER BY jdp_modified desc LIMIT 0,200  );

2014年4月24日 16:22
0 0

奇怪哈..既然tid是主键,又是表自连,那直接这样写不就好了?

SELECT jdp_modified, jdp_response FROM `jdp_tb_trade` 
WHERE `seller_nick` IN ('李心','zhixian50','陈鹏','雪儿','稀饭','婷婷','七七')
AND `jdp_modified` > '2007-11-30 09:52:39'
AND `jdp_modified` <= '2014-04-21 22:31:13'
ORDER BY jdp_modified desc LIMIT 0,200

2014年4月24日 12:57
0 0

我觉得吧这种方式应该可以实现...展开余下内容

2014年4月23日 17:35
0 0

你为啥不把后面的条件放在前面,可以走索引,缩小范围,然后再查in

2014年4月23日 15:52
0 0

你是在搞聚石塔吧,为什么要IN

2014年4月23日 13:11
0 0

是不是没用PreparedStatement?感觉像是头几页mysql生成执行计划,所以慢,后面查询快是因为测试的时候查询条件不变沿用了执行计划,所以快了。换成PreparedStatement+动态参数会不会好点?

2014年4月23日 10:27
0 0

没有必要不要用order by,order by 比较耗时,用exists 性能比in要好一些

2014年4月23日 08:35
0 0

SELECT  t1.jdp_modified,t1.jdp_response FROM jdp_tb_trade t1, jdp_tb_trade t2
where t2.`seller_nick` IN ('李心','zhixian50','陈鹏','雪儿','稀饭','婷婷','七七') ) AND ( (t2.`jdp_modified` > '2007-11-30 09:52:39') AND (t2.`jdp_modified` <= '2014-04-21 22:31:13')  ) and t1.tid=t2.tid 
ORDER BY t1.jdp_modified desc LIMIT 0,200    

这样试一下?(主要是把子查询修改为内联查询)

2014年4月22日 23:12
0 0

exists

2014年4月22日 22:00
0 0

SELECT  t1.jdp_modified,t1.jdp_response FROM jdp_tb_trade t1 where exsits
(SELECT * FROM jdp_tb_trade t2 WHERE ( t2.seller_nick IN ('李心','zhixian50','陈鹏','雪儿','稀饭','婷婷','七七'))
AND ( (t2.jdp_modified > '2007-11-30 09:52:39')
AND (t2.jdp_modified <= '2014-04-21 22:31:13')) and 1.tid=t2.tid ORDER BY t2.jdp_modified desc LIMIT 0,200)

2014年4月22日 21:59

相关推荐

    C#程序开发范例宝典(第2版).part13

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    C#程序开发范例宝典(第2版).part08

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    C#程序开发范例宝典(第2版).part02

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    C#程序开发范例宝典(第2版).part12

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    C#.net_经典编程例子400个

    57 2.2 Button控件应用 58 实例053 在Button按钮中显示图标 58 2.3 ComboBox控件应用 59 实例054 将数据表中的字段添加到ComboBox控件 59 实例055 带查询功能的ComboBox控件 61 2.4 ...

    SQL sever 实训

    --计算有多少种产品(假设为x),然后显示一条信息:共有X种产品 DECLARE @X int SET @X =(SELECT COUNT (*) FROM Product ) PRINT '共有'+convert (char(2),@x)+'种产品。' GO --编写计算n!(n=20)的程序,并...

    亮剑.NET深入体验与实战精要2

    5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理...

    亮剑.NET深入体验与实战精要3

    5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理...

Global site tag (gtag.js) - Google Analytics