日常项目随着业务扩张,mysql存储数据量大时(千万级+)使用limit分页,随着页码的增大,查询效率会变的低下。
数据量在万级别,任何查询只要sql正常,用户体验估计无感知。作为码农应时刻以代码最优实现为目标。
示例:
table_test:除id自增主键外,其余字段均为设置索引。
分页查询
limit原理:扫描n+size条数据,丢弃前n条,返回size条,故越后越慢。
SELECT * from table_test LIMIT 10 OFFSET 20000000
# 在4kw数据下,查询时间233.385s
优化1
减少扫描行数,提升查询速度
SELECT * from table_test WHERE id >= 20000000 LIMIT 10
优化2
子查询
SELECT * from table_test WHERE id >=
(SELECT id from table_test limit 20000000 ,1) LIMIT 10
优化3
另一种方式的子查询
SELECT a.* from table_test a
JOIN (SELECT id from table_test limit 20000000, 10) b
ON b.id = a.id
优化后的速度3.232s,建议若有可排序字段,根据实际情况加入到查询语句,也能提升效率。不管采用哪种优化方案,查询效率相比未优化都是质的提升。
再来一发:
我们在按固定条件查询时【查询条件是非索引字段】,一般会这么写,如:
select * from table_test where name = '张三'
初看查询语句,没任何问题,但在数据量大时,查询效率极低。
测试发现:上述语句查询在4kw数据量时,查询时间xxx,emmm....反正是半天没查出来,手动stop了。
改良:加上limit 1,查询时间3.023s。
总之
优化思想:尽量减少mysql查询时扫描的行数。