M

[Mysql] Mysql中超过千万条数据查询问题

RoLingG 其他 2024-04-19

Mysql超过千万条数据查询问题

偏移量越大,花的查询时间越大

数据量越大,花的插叙时间越大

在数据量大的场景下

要想让Sql能够在大量数据面前查询的又快又好,有如下三种思路:

第一种思路是通过Mysql自身优化。例如select * from去获取整条列的数据,Mysql自身的优化器会加*自动替换为该列的所有字段,如果我们一开始写的Sql语句就是该列的所有字段,就不需要优化器去花时间替换了。

第二种思路就是优化网络IO方面。Sql的查询列在实际过程中如果使用select *这种查询对象不明确的手段,往往只会使用到查询结果的一部分,另外的一些多余部分对于我们的网络IO来说就是多余的负担,所以网络IO优化实际上就是优化掉这些多余的部分。

第三种思路就是是否有合理运用好Sql自身,例如索引。

综合上面三种方法,总结出下面实战中的优化:

  1. 明确查询字段,避免使用select *,减少优化器的负担。例如将*手动替换成全字段
  2. 按需求查询,减少多余的查询数据,进而减小网络IO负担。如果该查询列有索引覆盖,就能够更快更准确的找到相应的数据。(相比于全字段来说又少了一些不必要的数据,有索引还用到了索引,更好更快)
  3. 查询字段索引覆盖,通过辅助索引提升查询效率(索引为什么能提高效率主要也与索引底层的B+树结构有关)。

其实第三点就是在第二点的基础上更优化了一些,可以整合成一个方法。虽然来说添加索引也需要消耗时间,而且在千万级以上的数据量来说耗时肉眼可见的久,但是能一劳永逸,添加完索引之后的查询会快很多很多。

在偏移量大的场景下

数据量大的场景下,其问题的解决方法也同样可以直接套到偏移量大的场景。

但偏移量大的场景还有一种方法可以优化:将偏移量改为使用ID限定范围的方式提升查询效率。

当我们通过ID限定范围的方式进行优化时,Sql会先从ID的索引进行范围查找,而普通的Limit偏移限定范围是进行全表扫描。所以对比一下就知道,普通的Limit并不像具有索引的ID用Where进行限定ID范围查找缩减了扫描数据数量,肯定是通过具有索引的ID进行限定范围查找要快得多啦。

PREV
[Mysql] Mysql索引的B+树结构
NEXT
[后端知识] Epoll内部数据结构

评论(0)

发布评论