优化原则:减少数据访问的行数
mysql分页由两种方式,一种是物理分页,另一种是逻辑分页,逻辑分页是说,我们把数据全部查到业务服务器中,然后在内存中进行数据筛选,可想而知,这种方式对于稍微大一点的数据库表就不可行了。所以业务开发中,应该尽量使用物理分页(除非你的数据量很小)。物理分页看下面这个sql:
SELECT firstname,endName,age,address,school,money FROM user WHERE age<18 AND sex = 1 LIMIT 0,10
很简单,这个sql的目的是查询user表中,年龄小于18并且性别是1(男性用户)的数据,分页条件是:每页10条数据,查询第一页。
再看下面这条sql:
SELECT firstname,endName,age,address,school,money FROM user WHERE age<18 AND sex = 1 LIMIT 1000000,10
乍一看好像也没有什么问题,但是实际上,这条sql的性能会比前面那条下降相当多。原因是因为mysql的limit语句原理是,先把所有数据查出来,然后再截取对应的数据。也就是说,LIMIT 1000000,10 ,实际上不只查询了10条数据,而是查询了1到1000010的数据,然后截取了1000000到100010这10条数据。
SELECT firstname,endName,age,address,school,money FROM user INNER JOIN (SELECT id FROM user WHERE age<18 AND sex = 1 LIMIT 99910,10) temp ON (temp.id = user.id)
考虑到sql的执行顺序,这条sql能够相当大幅度的提高效率。