Php 如何加速分页所需的MySQL查询-表中的百万条记录

Php 如何加速分页所需的MySQL查询-表中的百万条记录,php,mysql,Php,Mysql,大约有100万条记录。 分页系统需要查询 查询如下所示: SELECT field1, field2, field3 FROM table WHERE field4 = '$value' ORDER BY field5 ASC limit $offset, 30; 字段4和字段5上有索引 所有字段都是varchar类型。 Field5测试为int,但没有实际的改进通知 现在使用0,30限制进行查询大约需要1秒,但是使用119970,30限制进行查询大约需要20秒 在分页页面上获得小于0.1

大约有100万条记录。 分页系统需要查询

查询如下所示:

SELECT field1, field2, field3 FROM table 
WHERE field4 = '$value' 
ORDER BY field5 ASC limit $offset, 30;
字段4和字段5上有索引

所有字段都是varchar类型。 Field5测试为int,但没有实际的改进通知

现在使用0,30限制进行查询大约需要1秒,但是使用119970,30限制进行查询大约需要20秒

在分页页面上获得小于0.1秒的结果是否现实?网站需要这样的加载时间才能提供良好的用户体验

解释选择限制为0,30


我建议不要直接将数据完全加载到分页中,而是在用户单击不同页面时再次使用ajax查询。因此,在精确页面中,它只显示当前页码数据。希望它能帮助您,祝您好运。

根据您的数据变化程度,您可以使用它来减少运行特定查询所需的时间,并减少大多数用户的响应时间

这张桌子有PK吗? 从表中选择字段1、字段2、字段3作为 从表中联接select PK,其中field4='$value' 按字段5订购ASC限额$offset,30作为b
a.PK=b.PK

您是否考虑过创建另一个表6,它是表4的索引哈希?搜索数字而不是文本将要快得多,因此查询类似于:

从表中选择field1、field2、field3 Force IndexTable6 其中字段6='$hashvalue'和字段4='$value' 按字段5订购ASC限额$offset,30


在进行文本搜索之前,它应该有助于消除99.99%的数据,并且无论偏移量如何,都应该加快查询速度。

您可以尝试表分区:


它应该有索引B-树字段4,字段5。
此索引将允许MySQL使用field4查找记录,并在field5上按顺序限制它们。

美元值的变化频率如何?你能缓存查询结果吗?您真的希望用户得到第120000个结果吗?显示表架构并解释查询。@Mark Elliot值更改多次大约有2000个不同的值。有很多类似的查询,所以MySQL缓存是有限的,我希望第一次加载也很快。是的,我希望用户可以分页,因为甚至有到最后一个分页页面的链接,机器人会扫描所有的webiste。现在,即使第一页加载5秒。您是否优化了服务器配置?我的意思是,我不希望这个查询会尖叫,但在合理的硬件上,<1秒的时间应该很容易实现。@Tyler Eaves MySQL服务器使用my-hugh.cnf进行了相当优化。你想要什么类型的硬件?我使用的机器带有2.4 GHz Intel Core 2 Duo和2 GB SDRAM。Ajax无法使用,因为搜索引擎机器人无法抓取分页页面。这对任何人都没有帮助。这将导致发布的查询结果。@Newbie1:我知道我写这篇文章迟到了,但我个人同意Eric T的观点。使用ajax加载分页实际上是许多站点的常见做法。搜索引擎机器人仍然可以抓取网站,因为你只需要提供一个?页面=。。。为您的网址。但是,网站加载速度会更快,在用户向下滚动到底部之前,您可以加载分页,因此用户根本不会注意到任何内容……您还可以分析使用情况以查看实际加载的页面。也许只有前100名被关注。缓存那些页面,不用担心其他页面。当然,由于性能原因,超出前两个或前三个页面的页面现在可能无法查看。所有页面都必须快速加载,因为机器人会扫描所有网站。这都是可爬行的,加载时间现在是重要因素。如果您的数据和分页保持相对静态,我建议设置memcached。使用重复查询的STIE确实可以提高性能。memcached会在第一时间快速提供结果,还是需要运行一次才能首先缓存页面?我需要解决方案,它将在第一次时加快加载时间。memcached不会在第一次和以后每次需要运行查询时加快查询速度。是的,id是主键,您的查询命题没有加快。请您进一步解释一下,表6是表4的索引哈希。字段6和“$hashvalue”是什么?
id: 1
select_type: SIMPLE
table: table
type: index
possible_keys: NULL
key: field5
key_len: 768
ref: NULL
rows: 223636
Extra: Using where