table 表中30万记录 id,自增主键, node,create_at 都有索引 但是没有联合索引
下面的语句查一次要8s左右, 可以预估随着数据的继续增加,速度会越来越慢。 最近在学习 mysql 查询优化
也看了很多文章,教程(但是没有系统的看mysql手册,不好意思)
请各位朋友指导下,如何优化,如果可以 请大概讲述下,怎么分析的,为什么使用xxxx方式优化就会有效。
谢谢各位。
EXPLAIN
SELECT
`id`
FROM
`table`
WHERE `node` = 2
ORDER BY `create_at` DESC
LIMIT 12 OFFSET 69996
------------------------------------------------------------------------
id: 1
select_type: SIMPLE
table: table
type: ref
possible_keys: node
key: node
key_len: 5
ref: const
rows: 72278
Extra: Using where; Using filesort
不要使用OFFSET方式分页
以你的例子来说
MySQL会先查询所有符合条件的数据,通过EXPLAIN可以发现(72278),查询了这么多
因为OFFSET的关系,MySQL丢弃前面(69996)的记录。
查询优化就是指在第1步的时候就让MySQL查询最少的数据。
我目前在用的分页方式(数据量千万级),依旧拿你的例子来说,假设分页大小为10
第一页
假设查询1的第10条数据的id是10,第1条数据的id是1
那么查询第二页的SQL如下
这样你可以发现响应速度超快。
不过有个问题是无法前往指定页数,不过从我目前的实际情况来看,这个没有影响,有个搜索功能就可以弥补