昨晚在部署一个网站的时候死活打不开,经排查是主页的查询问题,将sql拿出来执行竟然要97秒。自己的博客数据量小,没有发现这个问题,但是这里有6000多条。在博客的改进过程中,考虑到正文表数据量较大,可能会出现效率问题,我将文章的正文分离出来一个表再与文章表关联。
起初怀疑是视图问题,因为之前遇到过。还有怀疑是select count 的问题,在mysql 中 select count(*) from a 没有问题,但是select count(*) from (select * from a) 在a表数据很多的情况下就会有问题,但是sqlserver中没有该现象。
逐渐排查这个sql,去掉order by 后发现不到1秒。再逐渐排查,将一个Left join 去掉后提高不少,本来order by 和limit 也没有用到这个表,于是将它拿到外面来。之前是这样 select * from a left join b on a.id=b.id order by xxx limit 0,10 修改后 select * from (select * from a order by xxx limit 0,10) t left join b on t.id=b.id order by xxx 修改后果然效率提高不少。
为什么order by limit 会出现这么慢呢,怀疑是关联的字段没有索引,建立索引后,果然查询很快了。正文表和文章表是一对一的关系,但正文表我却没有用文章ID作为主键,而用的另一个Guid 导致没有索引。 但是在sqlserver 中查询并不会慢,不知道为什么。
全部干掉正文ID用文章ID作为主键,从发现问题到调整完竟然花了4个小时....