来看一条sql:
SELECT m_id ,is_tax_paid FROM merchandise WHERE m_id > 10 AND last_update_time < NOW() ORDER BY m_id LIMIT (pageNum-1) * pageSize,pageSize
merchandise表的m_id和last_update_time都加了唯一索引,当然,这里不是组合索引。
初一看,这条sql没有任何问题,但在线上跑了一阵子之后,有严重的性能问题,单次查询要3秒左右,被记录成慢sql。
原因是merchandise表太大,线上有1亿多行数据,当页数太多的时候,mysql的limit分页要检索的数据太多了,具体要看下mysql的B+树索引是怎样查数据的。
知道原因了,改进的方法,只需要按id来分页,每次查询的时候,指定id的大小,然后再limit,如:
SELECT m_id ,is_tax_paid FROM merchandise WHERE m_id > ? AND last_update_time < ? ORDER BY m_id LIMIT pageSize
每次循环的时候从查出的结果里找到最大的m_id,把它传给下次的sql查询。上面的 m_id最好是唯一索引,主键索引,最好。
long updateBeginMid = 19541094l; while (true) { List<MerchandiseIsTaxPaid> midIsTaxPaidPairs = vipGoodsDao.listMidByLastUpdateTime(lastMigrateUpdateTime,updateBeginMid, BATCH_SIZE); doSomething(midIsTaxPaidPairs); if (CollectionUtils.isEmpty(midIsTaxPaidPairs) || midIsTaxPaidPairs.size() < BATCH_SIZE) { break; } else { int size = midIsTaxPaidPairs.size(); MerchandiseIsTaxPaid merchandiseIsTaxPaid = midIsTaxPaidPairs.get(size - 1); updateBeginMid = merchandiseIsTaxPaid.getMerchandiseNo(); // 每次查询从最大的更新id开始查起 } }
也可以参考这里:
http://database.51cto.com/art/201005/200395.htm
相关推荐
总之,理解`LIMIT`的性能问题并采用适当的优化手段,是提升MySQL数据库应用性能的关键。合理地使用索引、子查询和JOIN可以帮助我们避免在大数据量时扫描过多的记录,从而显著提高查询速度。在开发过程中,应结合具体...
MySQL中的分页查询是Web应用中常见的操作,但随着数据量的增长,`LIMIT`语句在处理大量数据时性能会显著下降。特别是当`OFFSET`值增大时,MySQL需要扫描更多的行来找到需要的数据,这可能导致查询速度变慢,甚至对...
结论:rows 相同条件下,offset 值越大,limit 语句性能越差 二、测试 执行测试: 5750000 条数据 sql 1 执行时间: sql 6执行时间: 三、优化 方式一:可根据主键ID等其他索引字段定位到数据位置,然后使用 limit 0...
下面记录一些limit性能优化方法。 Limit语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是...
为了解决LIMIT分页的性能问题,可以采用一些优化策略。比如,结合索引来提高查询效率,尤其是在ORDER BY的列上建立索引,可以显著减少查询时间。另外,如果可能的话,可以考虑使用ROW_NUMBER()函数,配合CTE(Common...
在《MySQL高性能优化》这本书中,作者深入浅出地探讨了如何最大限度地提升MySQL数据库的运行效率,确保系统的高可用性和高性能。 一、索引优化 索引是MySQL数据库性能的关键因素。正确地创建和使用索引可以显著提高...
然而,随着数据量的增长,LIMIT的性能问题变得尤为突出。本文将深入探讨如何优化MySQL中的LIMIT分页查询,以提高数据库查询效率。 首先,理解LIMIT的工作原理至关重要。LIMIT用于指定返回结果集的数量,通常与ORDER...
Mysql的分页的两个参数 select * from user limit 1,2 ... 您可能感兴趣的文章:详解MySQL的limit用法和分页查询语句的性能分析MYSQL分页limit速度太慢的优化方法mysql limit分页优化方法分享Mysql limit
同时,保持良好的数据库设计和索引策略也是避免此类性能问题的关键。为了进一步提升数据库性能,还可以关注其他SQL优化技巧,如适当使用索引、避免全表扫描、减少JOIN操作以及优化查询语句结构等。
- **open_files_limit=10240**:设置MySQL进程可同时打开的最大文件数量,对于多表连接或大事务处理尤为重要,较高的值有助于提升性能。 - **back_log=600**: - **作用**:定义在MySQL暂时停止接收新连接前,短...
- **LIMIT与性能**:当使用`LIMIT`配合`ORDER BY RAND()`时,需要注意性能问题。由于随机排序可能涉及大量数据的操作,因此对于大型数据表,这种方式可能会导致性能下降。 - **参数传递**:在上述示例中,使用了`...
这种现象被称为“LIMIT性能问题”。 为了解决这个问题,一种常见的优化策略是利用主键索引。例如,`SELECT id FROM collect ORDER BY id LIMIT 90000, 10`,由于使用了主键ID,查询效率较高,因为它可以直接定位到...
MySQL 是当前使用最广泛的开源数据库管理系统之一,高性能的 MySQL 服务器配置是每个开发者和 DBA 都需要关心的问题。下面是 MySQL 服务性能优化的 My.cnf 配置说明详解,基于 16G 内存的服务器配置。 1. 服务器...
MySQL 是一个广泛使用的开源关系型数据库管理系统,在实际应用中,如何提高 MySQL 的性能是一个关键的问题。本文将总结 MySQL 性能调优参数,涵盖 Innodb 相关参数、连接参数、缓存参数、日志参数等多方面,帮助...
然而,在处理大型表时,直接使用`LIMIT`进行分页查询可能会导致性能问题,因为MySQL可能需要扫描大量无用的数据。以下是一些优化`LIMIT`查询性能的方法: 1. **索引优化**:确保查询涉及的列有适当的索引,特别是...
在MySQL数据库中,`LIMIT`子句是一个非常重要的部分,特别是在处理大数据集时,它允许我们有效地控制查询结果的返回数量。`LIMIT`通常与`OFFSET`一起使用,以实现分页效果,使得用户能够逐步浏览大量数据,而无需一...
MySQL 性能优化详解 MySQL 是目前使用最多的开源数据库,但是 MySQL 数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此,在产品中使用 MySQL 数据库必须进行必要的优化。优化是一个复杂的任务,本文描述 ...