MySQL的优化
SQL优化
大表的分页怎么做
基于上一页最后一行数据的分页: 记住上一页最后一行数据的主键或唯一标识,然后在下一页查询时使用 WHERE id > last_id LIMIT pageSize 这样的方式,确保只检索比上一页最后一行数据更大的记录。
将limit变成子查询和原来的表做等值连接,子查询的 查询字段只有id,这样子查询 会走二级索引覆盖,再根据子查询中获得的id去主表中进行查找。主要目的就是省略掉前面5000条记录的回表操作。
在处理大表的分页时,常规的分页方式可能会面临性能问题,因为传统的分页操作需要对整个表进行查询和计数,而在大表情况下,这可能会导致查询慢或资源耗尽。以下是一些在处理大表分页时的优化建议:
使用索引: 确保分页列上有索引。索引可以显著提高分页查询的性能,因为它可以加速数据的查找和排序过程。
使用主键分页: 如果主键列适合做分页,可以直接使用主键进行分页,因为主键通常已经有索引。
使用预先计算的总数: 避免在每次分页查询时都计算总数,因为这可能需要全表扫描。你可以通过定期(或实时)计算总数并缓存起来,然后在需要分页时直接使用。
使用分页缓存: 对于热门查询,可以考虑使用缓存来保存分页结果,以避免在每次请求时都进行数据库查询。
水平分表或分区: 如果表的数据量非常大,可以考虑水平分表或分区,将数据分散到不同的表或分区中,以减小单个表的数据量。
采用合适的数据库优化策略: 根据数据库类型,可以考虑使用数据库特定的优化策略,例如 MySQL 的 LIMIT、Oracle 的 ROWNUM 等。
异步分页: 将分页操作异步化,通过后台任务或消息队列来处理大数据量的分页请求,以减轻主要业务流程的负担。
使用数据库分页插件: 一些数据库(如MySQL、PostgreSQL)提供了分页插件,可以根据数据库特性选择合适的插件。
在实际应用中,最佳的分页策略取决于具体的业务需求、数据库类型和表结构。综合考虑性能、可维护性和查询效率等因素,选择适合你应用场景的分页策略。
索引失效的情况
两类隐蔽的不能利用索引的case:
(1)表列类型,与where值类型,不一致;
(2)join表的字符编码不同;
画外音:本文测试于MySQL5.6。