问个查询效率问题!!

lostgdi731 2006-04-17 04:05:46
有一数据库 db_custom ,里边 5万条数据。id 为索引键
其中finish_flag 数据的值是 0 / 1 ,且这5万条数据只有最后新插入的70条数据的finish_flag值为0,其余都为1了。

select * from db_custom where finish_flag=0 order by id desc limit 50

select * from db_custom where finish_flag=0 order by id desc limit 100

但这两句执行花费的时间差别却很大,第二条是第一条的20多陪时间。
我想是因为5万条数据里一总只有70条符合提交的,那么mysql就循环了5万次去企图查询我所需要的100条。而第一条却是因为50条mysql不用循环所有数据就能给我完成了,所以才快了。

请问有什么办法或技巧:我想使上边的查询基础上,让mysql一旦帮我“循环查询”到一定行数#(无论是否符合条件)都终止并返回结果?因为这样花费太多时间了。
...全文
143 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2006-04-18
  • 打赏
  • 举报
回复
买本 《MYSQL 权威指南》吧,这本书还是很好用的。

关于索引,要根据实际应用建立。
字段再多一般都是分 分类、条件字段 以及 一般的资料字段。

大多数都是不需要加索引的。

整理你的实际应用,看看用到了那些where, group by ,order by ,然后建立适当索引。
lostgdi731 2006-04-18
  • 打赏
  • 举报
回复
不是我不想加啊,但我的哪个表了有大概80多个字段啊。谢谢
XqYuan 2006-04-18
  • 打赏
  • 举报
回复
@_@居然没有加索引
lostgdi731 2006-04-18
  • 打赏
  • 举报
回复
to yh801216(艾奥利斯)
确实 我对finish_flag加了索引果然快多了。谢谢了

不过我很想了解一下索引的原理。能不能给的方向?我在google.com等等找过了,好象都没相关的原理。谢谢
lostgdi731 2006-04-17
  • 打赏
  • 举报
回复
呵呵,想不到大家都那么热情啊。谢谢先。
是的,其实大概也是0.5sec,但第一条所需的时间只是0.002-0.005sec 而已,差太多了。

当然了,我估计第二条是逐行(之前我说成了循环)地全表查询了。
所以我想在第二条原来的基础上试他执行到第N个逐行后(无论是否符合我需要的条件的行)就返回结果,我想知道的就是相关这个技巧。谢谢
XqYuan 2006-04-17
  • 打赏
  • 举报
回复
30万的数据库,有一个数据是59000多,我limit70000好像也是0.5sec左右

不知道你是什么问题
「已注销」 2006-04-17
  • 打赏
  • 举报
回复
什么要循环查询,需要循环么?
那叫逐行...

循环5万次的话数据库就差不多可以扔了...

第二个做了个全表查询而已.呵呵

XqYuan 2006-04-17
  • 打赏
  • 举报
回复
有可能是配置文件中某个参数设置的比较小的缘故
XqYuan 2006-04-17
  • 打赏
  • 举报
回复
不过只有70条数据没有测,我再试一下
XqYuan 2006-04-17
  • 打赏
  • 举报
回复
我用一个30万条数据的数据库测试了一下,发现两个时间差不多,都是0.5x sec

你不会是先运行第二个有缓存了,然后运行第一个吧
「已注销」 2006-04-17
  • 打赏
  • 举报
回复
呵呵,0.002-0.005,很正常。
「已注销」 2006-04-17
  • 打赏
  • 举报
回复
记得关于数据库的书中好像写到:“对于取值仅有有限几种的字段,不需要加索引”。

不过,那个我的理解是指用在查询条件中的字段,之所以不加索引是效果不明显却占用大量空间吧。。

在这里,楼主是不是没有给finish_flag加索引阿?呵呵,加了索引就好了
XqYuan 2006-04-17
  • 打赏
  • 举报
回复
你把数据库重启一下,再运行第一个....0.002到0.005一般缓存才用这么少的时间吧,实在太少了些

57,065

社区成员

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

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