mysql语句优化

lgb934 2010-03-25 10:09:00
我用的是mysql5.0,

我程序中用到了一句sql是
select count(DISTINCT id) from Policyinfo p where p.filename not in
(select p2.filename from Policyreadinfo p2 where p2.reader='test')

但是每次在程序中每次执行这句sql时网页就特慢,要10多秒,而这2个表的记录行数也就1000多而已,我把这句sql单独拿到SQLyog Enterprise里执行也很慢,和网页的执行时间差不多。我想在policyreadinfo表里建个索引,但是每次我执行建立索引的sql时,MYSQL就会停掉,建不了索引。

我用的到的结果如下:
"id", "select_type", "table","type","possible_keys","key","key_len","ref","rows","Extra"
"1", "PRIMARY", "p", "ALL", \N, \N, \N, \N, "1715","Using where"
"2", "DEPENDENT SUBQUERY","p2", "ALL", \N, \N, \N, \N, "4196","Using where"


其中表Policyinfo结构为

CREATE TABLE `policyinfo` (
`id` int(11) NOT NULL auto_increment,
`filenum` varchar(50) default NULL,
`filename` varchar(100) default NULL,
`filecontent` longtext,
`writetime` datetime default NULL,
`writer` varchar(100) default NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Policyreadinfo 表的结构是


CREATE TABLE `policyreadinfo` (
`id` int(11) NOT NULL auto_increment,
`filename` varchar(500) default NULL,
`reader` varchar(100) default NULL,
`readtime` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



...全文
170 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgb934 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zyfvcxz 的回复:]
这样估计要好些

select count(DISTINCT id) from Policyinfo p where not exists
(select 1 from Policyreadinfo p2 where p2.reader='test' and p2.filename = p.filename )
[/Quote]

这些都不行,我试过了,效率不高,和我没有优化的一样,
boy 2010-04-04
  • 打赏
  • 举报
回复
设计有问题,先改设计,再谈优化,要不上了几百万数据直接就K了,呵呵!

CREAT TABLE `policyreadinfo` (` int(11) NOT NULL auto_increment,
`fileid` int(11) NOT NULL,
`readerid` int(11) NOT NULL,
`readtime` datetime default NULL,
PRIMARY KEY (`id`),
key fileid ('fileid'),
key readerid ('readerid')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这就是一百多万数据的例子:http://www.dfwgw.com/dGFva2UvaG90XzcuaHRtbA==url.html
郑燕辉 2010-04-04
  • 打赏
  • 举报
回复
这样估计要好些

select count(DISTINCT id) from Policyinfo p where not exists
(select 1 from Policyreadinfo p2 where p2.reader='test' and p2.filename = p.filename )
ACMAIN_CHM 2010-04-02
  • 打赏
  • 举报
回复
改成这个试试。


select count(DISTINCT p.id) 
from Policyinfo p left join Policyreadinfo p2 on p.filename=p2.filename
where p2.filename is null
or p2.reader!='test'
lgb934 2010-04-02
  • 打赏
  • 举报
回复
执行计划?
我这个是判断用户有没有阅读过该条记录,是在用户一登陆系统时,给用户作提醒,你还有多少条记录没有阅读而已。页面上也只是把这个查询结果显示出来。

修改为join?怎么修改,最好可以给出SQL。谢谢
懒得去死 2010-03-29
  • 打赏
  • 举报
回复
修改为JOIN吧。这个是最基本的优化方式,在MYSQL当中。
hehe4569 2010-03-29
  • 打赏
  • 举报
回复
把你的执行计划贴一下吧
lgb934 2010-03-29
  • 打赏
  • 举报
回复
不行啊。我这个是判断用户是否阅读了该条记录的,我不能没个用户都加一列吧?

怎么没有其他人回答了嘛?
zsbing110 2010-03-25
  • 打赏
  • 举报
回复
可以在表policyinfo中再添加一列,来作为一个判断标志是否需要查询,这样就不会用到两个表的关联,这SQL基本上没什么改的

56,677

社区成员

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

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