优化mysql的limitoffset的例子
mysql 优化 例子
2023-06-13 09:14:45 时间
经常碰到的一个问题是limit的offset太高,如:limit100000,20,这样系统会查询100020条,然后把前面的100000条都扔掉,这是开销很大的操作,导致查询很慢。假设所有分页的页面访问频率一样,这样的查询平均扫描表的一半数据。优化的方法,要么限制访问后面的页数,要么提升高偏移的查询效率。
一个简单的优化办法是使用覆盖查询(coveringindex)查询,然后再跟全行的做join操作。如:
SQL>select*fromuser_order_infolimit1000000,5;
这条语句就可以优化为:
select*fromuser_order_infoinnerjoin(selectpinfromuser_order_infolimit1000000,5)aslimusing(pin);
SQL>explainselect*fromuser_order_infolimit1000000,5;
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
|1|SIMPLE|user_order_info|ALL|NULL|NULL|NULL|NULL|23131886||
+----+-------------+-----------------+------+---------------+------+---------+------+----------+-------+
1rowinset(0.00sec)
SQL>explainextendedselect*fromuser_order_infoinnerjoin(selectpinfromuser_order_infolimit1000000,5)aslimusing(pin);
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
|id|select_type|table|type|possible_keys|key|key_len|ref|rows|filtered|Extra|
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
|1|PRIMARY|<derived2>|ALL|NULL|NULL|NULL|NULL|5|100.00||
|1|PRIMARY|user_order_info|eq_ref|PRIMARY|PRIMARY|42|lim.pin|1|100.00||
|2|DERIVED|user_order_info|index|NULL|PRIMARY|42|NULL|23131886|100.00|Usingindex|
+----+-------------+-----------------+--------+---------------+---------+---------+---------+----------+----------+-------------+
3rowsinset,1warning(0.66sec)
根据两个explain的对比,可以清晰发现,第一个未使用索引,扫描了23131886行,第二个也扫描了同样的行数,但是使用了索引,效率提高了。这样可以直接使用index得到数据,而不去查询表,当找到需要的数据之后,在与全表join,获得其他的列。
相关文章
- MySQL索引优化技术:索引的有效使用(mysql索引的使用)
- MySQL 大数据量优化:提升效率与性能(mysql大数据量优化)
- MySQL优化:高并发查询技巧(mysql高并发查询)
- MySQL中优化XML查询功能(xml查询mysql)
- MySQL支持IPv6:一个新的跨界网络世界(mysqlipv6)
- 开启ssh连接MySQL 优化数据库性能(ssh连接mysql)
- MySQL优化:最佳实践工具(mysql优化工具)
- 优化Mysql优化:轻松搞定百万级数据查询(mysql百万级数据查询)
- MySQL连表查询优化:提升数据库查询性能(mysql连表查询优化)
- ?破解MySQL密码:位数是多少?(mysql的密码是多少位)
- MySQL 范围查询优化: 加速你的数据库操作(mysql范围优化)
- MySQL:如何安全保存数据(mysql保存数据)
- 什么MySQL中添加索引的基本命令(mysql添加索引命令是)
- MySQL分页查询优化:提升查询效率(mysql分页查询优化)
- 优化MySQL体系结构:利用内存临时表(mysql内存临时表)
- 如何检测和优化MySQL并发连接数(查看mysql并发数)
- 性能优化MySQL 性能优化筛选的技巧(mysql筛选)
- 使用MySQL多表进行分页查询(mysql多表分页)
- MySQL结果集合并优化实践篇(mysql 结果集 合并)
- 如何在 MySQL 数据库中建立用户?(mysql数据库建立用户)
- Mysql非空值处理:探究实现方法(mysql 非空判断)
- 优化MySQL数据库提升性能的秘诀(mysql 数据库性能)
- MySQL中使用key关键字来定义索引(mysql中key关键字)
- MySQL中的AND和OR使用逻辑运算符优化查询语句(mysql中and与or)
- YML配置MySQL解决数据库连接问题(.yml中配置mysql)
- MySQL状态监测与优化(mysql_status)
- MySQL高级语法,加速精准查询(mysql 不常用语法)
- MySQL优化技巧如何使用不定索引提升效率(mysql不定索引)
- 谨慎使用MySQL索引不宜滥用(mysql不建议索引)
- 回顾MySQL上周查询,优化数据处理效率(mysql 上周查询)