×

mysql分页查询limit优化 系统

mysql分页查询limit优化(系统由于点赞平论等查询导致MySQL数据库查询变慢,怎么优化点赞)

admin admin 发表于2023-11-12 11:37:02 浏览34 评论0

抢沙发发表评论

本文目录

系统由于点赞平论等查询导致MySQL数据库查询变慢,怎么优化点赞

摘要优化LIMIT分页

在系统中需要分页的操作通常会使用limit加上偏移量的方法实现,同时加上合适的order by 子句。如果有对应的索引,通常效率会不错,否则MySQL需要做大量的文件排序操作。

一个非常令人头疼问题就是当偏移量非常大的时候,例如可能是limit 10000,20这样的查询,这是mysql需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高。

优化此类查询的一个最简单的方法是尽可能的使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候这样做的效率会得到很大提升。

咨询记录 · 回答于2021-09-29

系统由于点赞平论等查询导致MySQL数据库查询变慢,怎么优化点赞

https://blog.csdn.net/ArtAndLife/article/details/119514824

升级服务器,升级数据库

也是方案

这。。。。。

能这么解决我到这里来提问

硬性要求的话,这个最直接

优化数据库结构

合理的数据库结构不仅可以使数据库占用更小的磁盘空间,而且能够使查询速度更快。数据库结构的设计,需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。

1. 将字段很多的表分解成多个表

对于字段比较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。

2. 增加中间表

对于需要经常联合查询的表,可以建立中间表以提高查询效率。通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率。

(3)分解关联查询

将一个大的查询分解为多个小查询是很有必要的。

很多高性能的应用都会对关联查询进行分解,就是可以对每一个表进行一次单表查询,然后将查询结果在应用程序中进行关联,很多场景下这样会更高效

其他的优化只能说微弱

优化LIMIT分页

在系统中需要分页的操作通常会使用limit加上偏移量的方法实现,同时加上合适的order by 子句。如果有对应的索引,通常效率会不错,否则MySQL需要做大量的文件排序操作。

一个非常令人头疼问题就是当偏移量非常大的时候,例如可能是limit 10000,20这样的查询,这是mysql需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高。

优化此类查询的一个最简单的方法是尽可能的使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回所需的列。对于偏移量很大的时候这样做的效率会得到很大提升。

mysql limit 性能优化问题

mysql 不允许对子查询用limit。我也遇到过limit的性能问题,但性能的瓶颈是order by上。对*做order by速度非常慢。我的改进是只对id做,查出所需id再去select * from table where id in(idstring);性能提高不少。如果是分页可以考虑用 sql_calc_found_row . 希望对你有帮助。 select sql_calc_found_row id from table where ------ limit 0,50;select found_row() ;两句一起用可以找出第一条语句的一共有多少符合条件的结果。

如何提高MySQL Limit查询的性能

如何提高MySQL Limit查询的性能?在MySQL数据库操作中,我们在做一些查询的时候总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的。其实我们可以使用Limit关键字来避免全表扫描的情况,从而提高效率。有个几千万条记录的表 on MySQL 5.0.x,现在要读出其中几十万万条左右的记录。常用方法,依次循环: select * from mytable where index_col = xxx limit offset, limit; 经验:如果没有blob/text字段,单行记录比较小,可以把 limit 设大点,会加快速度。问题:头几万条读取很快,但是速度呈线性下降,同时 mysql server cpu 99% ,速度不可接受。 调用 explain select * from mytable where index_col = xxx limit offset, limit; 显示 type = ALL 在 MySQL optimization 的文档写到“All“的解释 A full table scan is done for each combination of rows from the previous tables. This is normally not good if the table is the first table not marked const, and usually very bad in all other cases. Normally, you can avoid ALL by adding indexes that allow row retrieval from the table based on constant values or column values from earlier tables. 看样子对于 all, mysql 就使用比较笨的方法,那就改用 range 方式? 因为 id 是递增的,也很好修改 sql 。select * from mytable where id 》 offset and id 《 offset + limit and index_col = xxx explain 显示 type = range,结果速度非常理想,返回结果快了几十倍。Limit语法:SELECT * FROM table LIMIT rows | rows OFFSET offsetLIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。为了与 PostgreSQL 兼容,MySQL 也支持句法:LIMIT # OFFSET #。mysql》 SELECT * FROM table LIMIT 5,10; //检索记录行6-15//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为-1mysql》 SELECT * FROM table LIMIT 95,-1; //检索记录行96-last//如果只给定一个参数,它表示返回最大的记录行数目,换句话说,LIMIT n 等价于 LIMIT 0,nmysql》 SELECT * FROM table LIMIT 5; //检索前5个记录行MySQL的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。同样是取10条数据,下面两句就不是一个数量级别的。select * from table limit 10000,10select * from table limit 0,10文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。1、offset比较小的时候:select * from table limit 10,10 //多次运行,时间保持在0.0004-0.0005之间Select * From table Where vid >=(Select vid From table Order By vid limit 10,1) limit 10 //多次运行,时间保持在0.0005-0.0006之间,主要是0.0006结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。2、offset大的时候:select * from table limit 10000,10 //多次运行,时间保持在0.0187左右Select * From table Where vid >=(Select vid From table Order By vid limit 10000,1) limit 10//多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。