MYSQL(五)-----分页查询及优化

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;                                                         ③

就又会非常慢,综上:如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!

猜你喜欢

转载自blog.csdn.net/wangdongli_1993/article/details/81295741