`

mysql limit性能问题

 
阅读更多

来看一条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

 

 

 

分享到:
评论

相关推荐

    浅谈MySQL分页Limit的性能问题

    总之,理解`LIMIT`的性能问题并采用适当的优化手段,是提升MySQL数据库应用性能的关键。合理地使用索引、子查询和JOIN可以帮助我们避免在大数据量时扫描过多的记录,从而显著提高查询速度。在开发过程中,应结合具体...

    MYSQL分页limit速度太慢的优化方法

    MySQL中的分页查询是Web应用中常见的操作,但随着数据量的增长,`LIMIT`语句在处理大量数据时性能会显著下降。特别是当`OFFSET`值增大时,MySQL需要扫描更多的行来找到需要的数据,这可能导致查询速度变慢,甚至对...

    MySQL limit性能分析与优化

    结论:rows 相同条件下,offset 值越大,limit 语句性能越差 二、测试 执行测试: 5750000 条数据 sql 1 执行时间: sql 6执行时间: 三、优化 方式一:可根据主键ID等其他索引字段定位到数据位置,然后使用 limit 0...

    MySQL Limit性能优化及分页数据性能优化详解

    下面记录一些limit性能优化方法。 Limit语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是...

    关于Mysql分页的两种方法,假分页和limit分页

    为了解决LIMIT分页的性能问题,可以采用一些优化策略。比如,结合索引来提高查询效率,尤其是在ORDER BY的列上建立索引,可以显著减少查询时间。另外,如果可能的话,可以考虑使用ROW_NUMBER()函数,配合CTE(Common...

    mysql 高性能优化

    在《MySQL高性能优化》这本书中,作者深入浅出地探讨了如何最大限度地提升MySQL数据库的运行效率,确保系统的高可用性和高性能。 一、索引优化 索引是MySQL数据库性能的关键因素。正确地创建和使用索引可以显著提高...

    mysql limit分页优化详细介绍

    然而,随着数据量的增长,LIMIT的性能问题变得尤为突出。本文将深入探讨如何优化MySQL中的LIMIT分页查询,以提高数据库查询效率。 首先,理解LIMIT的工作原理至关重要。LIMIT用于指定返回结果集的数量,通常与ORDER...

    mysql分页的limit参数简单示例

    Mysql的分页的两个参数 select * from user limit 1,2 ... 您可能感兴趣的文章:详解MySQL的limit用法和分页查询语句的性能分析MYSQL分页limit速度太慢的优化方法mysql limit分页优化方法分享Mysql limit

    MySQL查询中LIMIT的大offset导致性能低下浅析

    同时,保持良好的数据库设计和索引策略也是避免此类性能问题的关键。为了进一步提升数据库性能,还可以关注其他SQL优化技巧,如适当使用索引、避免全表扫描、减少JOIN操作以及优化查询语句结构等。

    【荐】mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    - **open_files_limit=10240**:设置MySQL进程可同时打开的最大文件数量,对于多表连接或大事务处理尤为重要,较高的值有助于提升性能。 - **back_log=600**: - **作用**:定义在MySQL暂时停止接收新连接前,短...

    limit传参的使用方法

    - **LIMIT与性能**:当使用`LIMIT`配合`ORDER BY RAND()`时,需要注意性能问题。由于随机排序可能涉及大量数据的操作,因此对于大型数据表,这种方式可能会导致性能下降。 - **参数传递**:在上述示例中,使用了`...

    Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架

    这种现象被称为“LIMIT性能问题”。 为了解决这个问题,一种常见的优化策略是利用主键索引。例如,`SELECT id FROM collect ORDER BY id LIMIT 90000, 10`,由于使用了主键ID,查询效率较高,因为它可以直接定位到...

    mysql性能调优参数

    MySQL 是一个广泛使用的开源关系型数据库管理系统,在实际应用中,如何提高 MySQL 的性能是一个关键的问题。本文将总结 MySQL 性能调优参数,涵盖 Innodb 相关参数、连接参数、缓存参数、日志参数等多方面,帮助...

    mysql服务性能优化my_cnf配置说明详解16G内存[参考].pdf

    MySQL 是当前使用最广泛的开源数据库管理系统之一,高性能的 MySQL 服务器配置是每个开发者和 DBA 都需要关心的问题。下面是 MySQL 服务性能优化的 My.cnf 配置说明详解,基于 16G 内存的服务器配置。 1. 服务器...

    如何提高MySQL Limit查询性能的方法详解

    然而,在处理大型表时,直接使用`LIMIT`进行分页查询可能会导致性能问题,因为MySQL可能需要扫描大量无用的数据。以下是一些优化`LIMIT`查询性能的方法: 1. **索引优化**:确保查询涉及的列有适当的索引,特别是...

    mysql limit两个参数.docx

    在MySQL数据库中,`LIMIT`子句是一个非常重要的部分,特别是在处理大数据集时,它允许我们有效地控制查询结果的返回数量。`LIMIT`通常与`OFFSET`一起使用,以实现分页效果,使得用户能够逐步浏览大量数据,而无需一...

    十三MySQL性能优化详解.pdf

    MySQL 性能优化详解 MySQL 是目前使用最多的开源数据库,但是 MySQL 数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此,在产品中使用 MySQL 数据库必须进行必要的优化。优化是一个复杂的任务,本文描述 ...

Global site tag (gtag.js) - Google Analytics