关于Mysql索引查询效率问题
问题描述
SELECT COUNT(*) FROM `set_gif` WHERE `zhuanid` = 0 AND `webid` IN (’0’,’2’,’21’,’22’,’27’,’11’,’31’) AND `empty` = 0 LIMIT 1 [ RunTime:0.1423s ]SELECT `id`,`webid`,`catid`,`path`,`pname`,`pathall`,`title`,`cdn`,`sort`,`likecount`,`fsize`,`time`,`viewcount`,`likecount` FROM `set_gif` WHERE `zhuanid` = 0 AND `webid` IN (’0’,’2’,’21’,’22’,’27’,’11’,’31’) AND `empty` = 0 ORDER BY time desc,id desc LIMIT 0,10 [ RunTime:0.0045s ]
两个sql语句 后面runtime是执行时间的意思 数据量是150W
字段说明 zhuanid是数值 webid是数值 empty是0或者1
第一句SQL使用的普通索引是 zhuanid webid empty的数的一组索引第二句SQL使用的索引是zhuanid webid empty一组索引 time 与 id是一组索引
为什么第一句的count会消耗这么长的时间 相比第二句复杂的查询反而是很短的时间
问题解答
回答1:第一句sql, limit 1第二句sql, limit 0, 10你让count去数150w条....还想比查看前10条快?
回答2:我的猜测:索引字段没有设置不可为空,导致 count(*) 没有使用到索引。
另外这两条语句本身并不等价,第一条针对全表,第二条不是,好像没啥可比性
回答3:要看一下你的执行计划 第一条sql结果集很大的情况下是需要扫描所有符合条件的记录的 这种情况下第二条sql走time id的索引只需要找到10条满足条件的记录即可 所以会比较快 另外zhuanid webid empty的组合索引也只会使用到zhuanid列和webid的range部分 可以修改索引顺序为zhuanid empty webid
回答4:第一条SQL执行后,结果保存在Cache.
第二条SQL执行,依赖了第一条SQL的Cache,所以会更快(其实第二条SQL用了排序,应该更慢才对).
楼主可以在第一条SQL执行完后,执行
RESET QUERY CACHE;
重置Cache,然后在执行第二条SQL,结果是不一样的.
相关文章:
1. css3 - 微信前端页面遇到的transition过渡动画的bug2. javascript - Ajax返回json格式之后的数据解析后取出来的数据为undefined?3. css - 文字排版问题,内容都是动态抓出来的,字数不一定。如何对齐啊4. 网页爬虫 - 关于Python的编码与解码问题5. 前端 - WebStrom安装了angularjs插件,但是没有语法提示6. git - 在web应用分布式部署的情况下怎么进行配置更新7. 微信开放平台 - ios APP能不能打开微信然后通过微信跳转到指定的URL?8. selenium-selenium-webdriver - python 将当前目录加入到 环境变量9. javascript - imgzoom插件所引发的bug血案!!!!10. php ZipArchive关于不同目录文件压缩

网公网安备