sql分页语句
select * from 表名 limit M,N
表示查询表M条数据开始(不包括第M条数据),然后一共查询N条
select * from student limit 6,10:从学生表中的第六页开始,查询10条数据
单数的limit适用于数据量较小的查询,百千条数据的时候,这种查找的方法是全表扫描,找到页码
那么当数据量很大,越是查后面的页的数据时候,查询效率就会大大降低
使用唯一主键索引加排序
select * from student where id>=8000000 ORDER BY id desc limit 0,20
适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一索引,使得ORDERBY操作能利用索引被消除
索引扫描,速度会很快. MySQL的排序操作,asc升序,desc降序
利用表的覆盖索引来加速分页查询
利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快
利用子查询
select id from student limit 800000, 20
id是主键且是唯一索引,这样只需要查找索引结构,查询速度会非常快,但是这样查询只有id信息,那么如果要得到全列信息,可以使用子查询或者join连接
select * from student where id>=(select id from student limit 800000,1) limit 20
jion连接
select * from student a join(select id from student limit 800000, 20) b ON a.id= b.id
其中a是student的别名,b是看做子查询结果表的别名
这两种性能差不多,就是写法不同
上面说的办法条件只是涉及一个字段,那么就可以用唯一索引来优化,那么对于要使用到联合索引的情况呢
联合索引优化方法
例子
数据表 collect ( id, title ,info ,vtype) 就这4个字段,其中 title 用定长,info 用text, id 是自增主键,vtype是tinyint,id,vtype分别是索引。这是一个基本的新闻系统的简单模型。现在往里面填充数据,填充10万篇新闻。最后collect 为 10万条记录,数据库表占用硬1.6G。
用上面的唯一索引的子查询
select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10
速度很快,因为id做了索引,但是下面两条sql:
select id from collect where vtype=1 order by id limit 90000,10; 很慢 ①
select id from collect where vtype=1 limit 1000,10; 很快 ②
区别在于条件是涉及唯一索引还是多个字段不同索引
随意对于①的这种查询,我们可以建立(vtype,id) 这样的复合索引,那么①这种sql语句查询速度就很快。但是如果select还有另外的字段
select id ,title from collect where vtype=1 limit 90000,10; ③