小站的页面访问查询的速度一直不让人满意,恰好今天有时间,就决定对它优化一下。 mysql
由于在本地开时发,查询的速度是至关快的,一开始就觉得是mysql版本的问题,本地是MariaDB 5.5,服务器上是mysql 5.1, sql
将服务器上的数据弄到本地导了一份,竟然发现同样变慢了,平均查询一个文章要1-2秒,列表超过2秒以上,才几千的数据这么慢确定是哪里出了问题。 xcode
一点一点的定位打印日志,最后发现,竟然是一条使用了exists的sql语句,查询就用了2秒,也就是说时间都花在这个上了,其它的基本均可以忽略了,语句以下: 服务器
select * from TERM t where exists (select t2.TERM_ID from ASS_POST_TERM t2 where t.TERM_ID = t2.TERM_ID and t2.POST_ID = ?)
文章和分类的关联,这个语句没什么特别的地方,分开执行都是零点零几毫秒,拼在一块儿竟然要2秒,难以想象。 优化
难道是这个exists影响了吗?将exist换成in试一下: 日志
select * from TERM t where t.TERM_ID in (select t2.TERM_ID from ASS_POST_TERM t2 where t2.POST_ID = ?)
立马见效,查询时间从2秒提高为零点1毫秒左右,还真是这个exists的缘故。 code
网上都说exists的效率要高于in或才not in,看来也不尽然,具体状况还得具体分析啊,像在这里就比in差了20倍不止。 get
看来要好好研究一个exists这个关键字了。 class