MySQL百万级数据量分页查询方法及其优化建议

如题所述

第1个回答  2022-06-08
offset+limit方式的分页查询,当数据表超过100w条记录,性能会很差。
主要原因是offset limit的分页方式是从头开始查询,然后舍弃前offset个记录,所以offset偏移量越大,查询速度越慢。

比如: 读第10000到10019行元素(pk是主键/唯一键).

使用order by id可以在查询时使用主键索引。
但是这种方式在id为uuid的时候就会出现问题。可以使用where in的方式解决:

带条件的查询:
如果在分页查询中添加了where条件例如 type = 'a’这样的条件,sql变成 :

这种情况因为type没有使用索引也会导致查询速度变慢。但是只添加type为索引查询速度还是很慢,是因为查询的数据量太多了。这个时候考虑添加组合索引,组合索引的顺序要where条件字段在前,id在后,如 (type,id),因为组合索引查询时用到了type索引,而type跟id是组合索引的关系,如果只select id ,那么直接就可以按组合索引返回id,而不需要再进行一次查询去返回id

使用uuid作为主键不仅会带来性能上的问题,在查询时也会遇到问题。

因为在使用select id from table limit 10000,10 查询id数据时,默认是对id进行排序,返回的是排序后的id结果,如果我们想按插入顺序查询结果,这样查询出来的结果就与我们的需求不相符。

聚集索引跟非聚集索引:聚集索引类似与新华字典的拼音,根据拼音搜索到的信息都是连续的,可以很快获取到它前后的信息。非聚集索引类似于部首查询,信息存放的位置可能不在一个区域。对经常使用范围查询的字段考虑使用聚集索引。

InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。

如果您的表上定义有主键,该主键索引是聚集索引。
如果你不定义为您的表的主键时,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚集索引。
如果没有这样的列,InnoDB就自己产生一个这样的ID值,
优先选index key_len小的索引进行count(*),尽量不使用聚簇索引

在没有where条件的情况下,count(*)和count(常量),如果有非聚簇索引,mysql会自动选择非聚簇索引,因为非聚簇索引所占的空间小,如果没有非聚簇索引会使用聚集索引。count(primary key)主键id为聚集索引,使用聚集索引。有where条件的情况下,是否使用索引会根据where条件判断。

MySQL百万级数据量分页查询方法及其优化建议
主要原因是offset limit的分页方式是从头开始查询,然后舍弃前offset个记录,所以offset偏移量越大,查询速度越慢。比如: 读第10000到10019行元素(pk是主键\/唯一键).使用order by id可以在查询时使用主键索引。但是这种方式在id为uuid的时候就会出现问题。可以使用where in的方式解决:带条件的查询:如果在...

面试官问:MySQL中百万级数据量,如何分页查询?
1. 直接利用数据库SQL语句的LIMIT功能,但随着页码增大,查询效率会降低。2. 建立主键或唯一索引,结合每页限制(如10条),利用索引进行定位,减少全表扫描。3. 利用ORDER BY与索引配合,快速定位部分数据,如查询第1000到1019行。4. 子查询或连接查询与索引相结合,快速找到特定行的位置,然后读取数据...

mysql 千万数据分页查询优化
3. 使用复合索引,例如,将 where 条件与 limit 主键字段置于复合索引的前两位置,并仅查询主键,以优化查询性能。4. 利用 in 子句与索引优化连续 ID 查询效率。通过上述方法,MySQL 可高效处理百万乃至千万级数据的分页查询。在大型系统开发中,需注意数据库设计对性能的影响,并确保对 SQL 语句的控制...

如果谁再问你“如何优化mysql分页查询”,请把这篇文章甩给他!_百度...
优化分页查询的关键在于减少扫描记录的数量。以下几种方法可作为优化策略的参考:1. **最大ID查询法**:通过查询特定页码的最后一条记录的ID,直接跳过已访问的数据,减少扫描范围。例如,查询第一页时,获取最后一条ID(如10),下一页查询时只需从ID>10的数据中获取10条即可。2. **使用`BETWEEN`...

MySQL的分页优化技巧mysql下一页优化
以下是一些MySQL的分页优化技巧,可以帮助我们提高查询效率和避免一些常见的性能问题。1. 使用LIMIT语句 LIMIT语句用于限制返回的结果集大小,格式为LIMIT offset, count,其中offset表示结果集的起始位置,count表示结果集的大小。例如,LIMIT 0,10表示从结果集的第1行开始返回10行结果。示例代码:SELECT * ...

MySQL大数据量分页查询方法及其优化
这种方式的做法是先定位偏移位置的id,然后再往后查询,适用于id递增的情况。使用id限定优化大数据量分页查询 使用这种方式需要先假设数据表的id是连续递增的,我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询:当然了,也可以使用in的方式来进行查询,这种方式...

实战!聊聊如何解决MySQL深分页问题
我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下。本文将分4个方案,讨论如何优化MySQL百万数据的深分页问题,并附上最近优化生产慢SQL的实战案例。limit深分页为什么会变慢?先看下表结构哈:CREATETABLEaccount(idint(11)NOTNULLAUTO_INCREMENTCOMMENT'主键Id',...

面试官:Mysql千万级大表如何进行深度分页优化
面对千万级订单表的深度分页查询问题,当索引失效导致查询速度下降,我们需要采取优化策略。首先,分析LIMIT offset, count查询过程,它会先在二级索引中查找大量记录ID,再回表聚集索引获取数据,这在offset+count数值大时会导致全表扫描,索引效率降低。解决方案包括使用子查询,通过获取create_time获取第offset...

如何优化Mysql千万级快速分页
一个不正确的优化是采用 SQL_CALC_FOUND_ROWS,SQL_CALC_FOUND_ROWS 可以在能够在分页查询时事先准备好符合条件的记录数,随后只要执行一句 select FOUND_ROWS(); 就能获得总记录数。但是在大多数情况下,查询语句简短并不意味着性能的提高。不幸的是,这种分页查询方式在许多主流框架中都有用到,下面...

如何优化超大的分页查询?
首先,技术角度优化。通常,分页查询中使用 LIMIT 子句进行数据检索,尤其是在数据量巨大时,这种做法可能导致性能下降,这是因为数据库需要对大量的数据进行排序和过滤。针对这个问题,可以通过以下几种技术手段进行优化:1. 索引覆盖: 使用索引进行查询,避免回表操作。索引覆盖是指通过索引直接获取所需数据...

相似回答
大家正在搜