关于一条SQL语句效率的问题

wzwen 2011-04-23 02:07:15
我有个站,打开一直感觉有点偏慢,我以为是网站线路的问题。

最近维护服务器发现,显示的负载一直不太正常,没人访问的时候,居然也在1-3之间

这就有点奇怪了,后来发现是因为系统每分钟执行一个定时任务造成的,我将这个定时任务删除后,负载立即降到0.0-0.5左右

一切恢复正常了

原来这个定时任务,是我搞的发邮件的程序

用php写的,流程大体是这样,比如用户在网站上进行了一些操作,系统会在mysql数据库的email表里插入一条记录

然后定时任务每一分钟都去读这个表,看看有没有未被发送的邮件记录,如果有,就开始发邮件,发完了,再将这条记录的状态修改成已发送

我觉得问题就出在这条sql语句上面,这个语句是每分钟读email表的,所以应该是它造成了服务器负载长期变大

而且当email表里为空的时候,负载也是很大

$SQLString = "select * from email where status=0 order by id asc limit 0,10";

上面这条语句是读取email表的最后10条记录,条件是status字段为0


请问我现在应该怎么优化它?

或者有什么其他比较好的办法?
...全文
77 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kfyypm 2011-04-29
  • 打赏
  • 举报
回复
用临时表 试试 或者建立一个表 只读这个表 发完就删除记录 这样就不会一直读数据量大的表了
加油馒头 2011-04-28
  • 打赏
  • 举报
回复
我的建议倒没必要 用定时任务,直接每次即时发送就可以了
ACMAIN_CHM 2011-04-28
  • 打赏
  • 举报
回复
创建 ( status,id ) 的复合索引。
wzwen 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 loveflea 的回复:]

多建立一个表,如emaillog

email表的纪录发邮件后,插入纪录到emaillog表中,然后删除email表中对应的记录!
[/Quote]

这样感觉麻烦了一些呀,又多个表,。。
wzwen 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zuoxingyu 的回复:]

看楼主的字段名称,可以估计出ID是主键,STATUS是状态值。ID肯定是有索引的,状态值建索引不靠谱。

explain select * from email where status=0 order by id asc limit 10;
看看
[/Quote]

你的猜测很正确,我刚找了下关于mysql的explain用法说明,不知道加上这个效果会不会好些。

不过最近网站感觉负载没那么高了,等高的时候再试吧。
loveflea 2011-04-25
  • 打赏
  • 举报
回复
多建立一个表,如emaillog

email表的纪录发邮件后,插入纪录到emaillog表中,然后删除email表中对应的记录!
zuoxingyu 2011-04-25
  • 打赏
  • 举报
回复
看楼主的字段名称,可以估计出ID是主键,STATUS是状态值。ID肯定是有索引的,状态值建索引不靠谱。

explain select * from email where status=0 order by id asc limit 10;
看看
WWWWA 2011-04-25
  • 打赏
  • 举报
回复
status有几种值,在status、ID上建立索引试试
回南山种豆 2011-04-24
  • 打赏
  • 举报
回复
http://www.sphinxsearch.org/archives/19

可以参考
ACMAIN_CHM 2011-04-23
  • 打赏
  • 举报
回复
[Quote]
$SQLString = "select * from email where status=0 order by id asc limit 0,10";[/Quote]

创建 (status,ID)的索引。
rucypli 2011-04-23
  • 打赏
  • 举报
回复
status=0加索引

56,679

社区成员

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

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