这一条SQL如何优化

php中文网
发布: 2016-06-13 13:17:41
原创
1184人浏览过

这一条SQL怎么优化

SQL code
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000 order by g_likenum DESC limit 30
登录后复制


上面的SQL语句执行要2秒。太慢了。

我如果变成这样,但是实际需求是一定要排序的。
SQL code
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->select * from dx_gd_goods where g_label >= 100101000 and g_label<100102000  limit 30
登录后复制


这样做后,程序只需要0.16秒就可以返回

我怎样做才能到排序后,执行的时间又短呢。

------解决方案--------------------
g_label 和 g_likenum 字段都建立索引没有
------解决方案--------------------
我觉得你的测试不准确,没理由相差这么大。你是多次运行过取平均值吗?
------解决方案--------------------
g_likenum 没有用到索引
------解决方案--------------------
前一个语句执行慢,后一个执行快,我猜测原因是这样的:后者在扫描数据记录的时候,找到符合 where 条件的记录,只要凑够 30 个就好了,即使 g_label 没有索引,只要符合条件的记录在总的数据集合里所占的比例不是特别低,也没有什么问题;而前者则不行,它必须找到符合 where 条件的所有记录,然后再按照 g_likenum 排序,才能取出前面的 30 个,这个过程如果没有适当索引的帮助,很可能导致全表扫描。

解决问题的办法当然也只能是设置适当的索引。但是什么样的索引是适当的,还跟你的 dx_gd_goods 表中的数据分布特点有关系。比如,当符合 where 条件的记录所占的比例足够高,而 g_likenum 字段的区分度也很高的情况下,(g_likenum) 这样的索引就已经很好了;但如果符合 where 条件的记录只是相对很少一部分,那么 (g_label, g_likenum) 这样的索引可能效果会更好一点。

另外,有的时候数据库(比如 mysql)可能并不一定按你的想像来使用索引,所以要用 explain 进行考察,必要时可以通过 index hint 等手段进行干预。


――――――――――――――――――――――――――――――――
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
------解决方案--------------------
g_likenum 是不是数据很集中的那种?enum?
------解决方案--------------------
这是前段的sql吗?如果是的话你可以给g_label 和 g_likenum建立个符合索引,你的mysql是什么版本?可以的话创建分区呢
------解决方案--------------------
探讨

哈哈,
还好,刚才强制了一下索引,速度还可以接受了,0.7秒就返回了。
虽然不是很好,但是还可以接受引用:

这是前段的sql吗?如果是的话你可以给g_label 和 g_likenum建立个符合索引,你的mysql是什么版本?可以的话创建分区呢

------解决方案--------------------
在 g_label 和 g_likenum 上建联合索引
------解决方案--------------------
探讨
有点大

------解决方案--------------------
探讨

唠叨大哥,
我有这样的语句三条,

[code=SQL]
select * from dx_gd_goods where g_label > = 100101000 and g_label
select * from dx_……

------解决方案--------------------
探讨

哦,
我现在没有建立复合,我是分开建的。
引用:

引用:
有点大


能不能建分区呢,只是你已经给这两个字段建立复合索引了,不知道建分区效果是否明显了,不过你可以尝试先,如果没啥大效果再把分区删除了

------解决方案--------------------
那也就只能这样了,再优化就是大动作了
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号