本文章来给大家介绍一篇关于mysql中分页查询中使用order by 和limit查询变慢解决办法,因为在mysql分页利用limit来操作,同时排序也需要使用了order by ,所以经常会两者同是使用到,但是如果数据量大的话就会碰到查询很慢很慢,下面我来给大家介绍解决办法。

一条简单分页的sql查询语句,耗时2.6S

经排查导致变慢的原因: 1.limit + order by导致 2 .order by 未使用到正确的联合索引 3. select 的内容过大
(1) 如果我们先去掉limit

(2)如果我们先去掉order by

(3) 如果我们去掉content

优化1.0
首先我们可以在索引方面处理看看
未正确的使用到索引,出现这个问题的原因在于 MySQL 每次查询只能使用一个索引, 而 SQL 语句 WHERE 条件和 ORDER BY 的条件不一样, 索引没建好的话

如果必须要使用id 作为order by 时
1.添加新索引

2. 强制使用指定索引 force index(索引名)

2.0 优化
如果不想加索引,可以在sql语句上做处理

优化前 :
SELECT `id`,`title`,`content`FROM `bw_book_chapter` WHERE (`book_id` = 3133) AND (`bw_book_chapter`.`deleted_at` = 0) ORDER BY `id` limit 2
优化后:
SELECT `id`, `title`,`content` FROM bw_book_chapter INNER JOIN ( SELECT `id` FROM `bw_book_chapter` WHERE (`book_id`=3133) AND (`bw_book_chapter`.`deleted_at`=0) ORDER BY `id` limit 2 )as a USING (id)
mysql执行顺序 from > where >group by >having >select >order by >limit
分别在于:
优化前 的SQL需要更多I/O浪费,因为先读索引,再读数据,然后抛弃无需的行
优化后的SQL(子查询那条)只读索引(Cover index)就可以了,然后通过ID读取需要的列.
对mysql服务器优化也可以提升性能了.
