Mysql超过千万条数据查询问题
偏移量越大,花的查询时间越大
数据量越大,花的插叙时间越大
在数据量大的场景下
要想让Sql能够在大量数据面前查询的又快又好,有如下三种思路:
第一种思路是通过Mysql自身优化。例如select * from
去获取整条列的数据,Mysql自身的优化器会加*
自动替换为该列的所有字段,如果我们一开始写的Sql语句就是该列的所有字段,就不需要优化器去花时间替换了。
第二种思路就是优化网络IO方面。Sql的查询列在实际过程中如果使用select *
这种查询对象不明确的手段,往往只会使用到查询结果的一部分,另外的一些多余部分对于我们的网络IO来说就是多余的负担,所以网络IO优化实际上就是优化掉这些多余的部分。
第三种思路就是是否有合理运用好Sql自身,例如索引。
综合上面三种方法,总结出下面实战中的优化:
- 明确查询字段,避免使用
select *
,减少优化器的负担。例如将*
手动替换成全字段
。 - 按需求查询,减少多余的查询数据,进而减小网络IO负担。如果该查询列有索引覆盖,就能够更快更准确的找到相应的数据。(相比于全字段来说又少了一些不必要的数据,有索引还用到了索引,更好更快)
- 查询字段索引覆盖,通过辅助索引提升查询效率(索引为什么能提高效率主要也与索引底层的B+树结构有关)。
其实第三点就是在第二点的基础上更优化了一些,可以整合成一个方法。虽然来说添加索引也需要消耗时间,而且在千万级以上的数据量来说耗时肉眼可见的久,但是能一劳永逸,添加完索引之后的查询会快很多很多。
在偏移量大的场景下
数据量大的场景下,其问题的解决方法也同样可以直接套到偏移量大的场景。
但偏移量大的场景还有一种方法可以优化:将偏移量改为使用ID限定范围的方式提升查询效率。
当我们通过ID限定范围的方式进行优化时,Sql会先从ID的索引进行范围查找,而普通的Limit
偏移限定范围是进行全表扫描。所以对比一下就知道,普通的Limit
并不像具有索引的ID用Where
进行限定ID范围查找缩减了扫描数据数量,肯定是通过具有索引的ID进行限定范围查找要快得多啦。
评论(0)