日期:2014-05-18  浏览次数:20540 次

在线等——查询一条数据耗时8秒求大侠优化这条SQL语句
C# code

select l.*,p.province from jc_learner_base l left JOIN jc_learner_position p on l.learner_id = p.learner_id 
where 1=1 and l.state = 0 and (l.trueName = '尹立宁') ORDER BY l.registertime desc LIMIT 0,10



MYSQL数据库,查询耗时8秒

------解决方案--------------------
你数据库中数据量多大
------解决方案--------------------
order by 去掉就能快不少条件 1=1 是什么意思?能防注入吗?
------解决方案--------------------
因为不知道你具体的业务需求,仅从sql中看,减少 select * 的使用,用什么字段指明字段名,确定是left join还是inner join
------解决方案--------------------
表jc_learner_position是454312条数据?
逻辑可以修改吗?一般ID是主键吧,left join->Inner join?
如果不能修改成内连,数据库的配置?连的是远程数据库吗?
再不行只能加索引了。

------解决方案--------------------
l.learner_id 
l.state l.trueName l.registertime
加复合索引。
------解决方案--------------------
探讨

不是优化sql代码就能行的,添加合理的索引,速度可能增加好几个数量级。

这个代码缺陷很多,left JOIN 性能低,如果是一对一的情况下inner join才对。

Inner join查询不到数据的话,说明等号连接的两个表根本就是多余的嘛。它们毫不相干,干嘛join ?

select l.* 筛选数据也是低效的,如果真的有必要使用全部字段还就另当别论。

------解决方案--------------------
路过,感觉不到SQL问题啊,弱弱的问是服务器向前段传递比较耗时么,项目中貌似SQL直接查数据都是ms级别的吧
------解决方案--------------------
1.合理使用索引用不到的全删除,主键设置 倒叙 非聚集索引最起码查列表的时候最新的在最前,条件设置聚集索引。 
2.select l.* 换成你想要的几个字段。
3.楼上3星的误导 left join 比inner join快。
4.还有你的registertime如果是datetime尽量换成smalldatetime用不到那么大。

------解决方案--------------------
454312 的数据量就算 select全量数据也不会太快, 你还用的是 select * 再加上left join, 不慢才奇怪呢


------解决方案--------------------
不清楚具体的需求,就算该也不一定符合你的要求。
自己考虑换种查询方式吧