这几天使用lucene在索引数据库记录,数据库里有1w左右的记录,其中最长的content字段,为text,当从数据库里通过分页查数据的时候使用一下语句
select * from article limit ?,?
当limit 3000,60 开始 数据基本要3s的样子,当到8000的时候,真的有蛮慢,有时候要37s,通过mysql的性能分析得知mysql的主要时间都花在sending data上了
超过3000就会这样,使用索引第一次也会这样,当加大缓存时候第二次使用相同的查询会很快,不过随便改个条件就又很慢了。
当换一个策略,select * from article where id > 3000 limit 1,60 又非常快,
如果这样
SELECT * from article t ORDER BY t.id LIMIT 7000,60
用explain是使用索引的,但从上面可以得出,这条语句只有在排序那使用索引,也就是说,查询实际上 还是全表扫描。
那这样,换一种方式:select t.id from article t.id limit 7000,60
然后 select t.* from article t where t.id in (...) 这些id中,然后用explain
1 SIMPLE t const PRIMARY PRIMARY4 const1
Primary说明使用了索引,这样就很快了
这里介绍一下mysql的profile性能分析
打开profile:
set profiling =1
可以查询最近执行的sql语句:
show profiles
根据queryid 查看具体的query
show profile for query 124