Limit 效率优化

昨天接到一个关于 mysql 的练习任务,查询一个学生做题表中某道题分数字段的最高分,拿到手想都没想直接交了一个这样的语句:

select score from submit_topic
where account_id = ? and topic_id = ? and topicset_id = ? and topic_typied = ?
order by score desc
limit 0, 1;

这里我没有用 max () 函数而是 limit,然后果断被学长 pass 了。和这个练习无关是否正确无关,关键是我没有考虑效率的问题;

Limit:

Limit 是限制数据显示行数的语句,语法是:Limit “开始读取位置”,“读取条数”,然后作用原理是从第一行开始扫描,一只扫描到你所指定的行数,然后再开始读取。

假如说数据量少的时候还好,要是数据量大的时候呢?要你从9999999行开始读取,然后只读取1条数据,这样做不光浪费系统资源,还拖垮了查询速度,所以一般来说尽量少用 Limit。

但并不是不用Limit,Limit 是分页查询中必不可少的,但需要采取一定优化,通常来说优化方式有两种,一种是通过基于主键用子查询定位偏移,另一种是通过页数和记录数算出主键索引的大致范围来查询;

样例:

select * from submit where score = 80 limit 999999, 10;

子查询:

select * from submit where score = 80 and id >= (select id from submit where score = 80 limit 999999, 1) limit 10;

当我们单单查询某一个字段的时候,运行速度比起查询所有要快个三倍左右吧,这里通过子查询定位了主键 id,然后读取10条数据,所以运行速度其实和只查询 id 字段差不多,大概也能快个三倍左右;

知道 id 大致范围:

select * from submit where score = 80 and id between 999999 and 100005 limit 10;

所以说学无止境啊,光光仅仅是学还是不够的,运用时还要考虑到多方面的影响,才能写出一段优秀的代码

猜你喜欢

转载自blog.csdn.net/Kiss_forever/article/details/115251839