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

时间:2011-04-20 01:13:27

标签: php mysql

大约有1百万的记录。 分页系统需要查询。

查询如下所示:

SELECT field1, field2, field3 FROM table 
WHERE field4 = '$value' 
ORDER BY field5 ASC limit $offset, 30;

field4和field5上有索引。

所有字段均为varchar类型。 Field5被测试为int但没有真正的改进通知。

现在使用limit 0, 30查询大约需要1秒钟,但使用limit 119970, 30进行查询大约需要20秒。

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

EXPLAIN(选择limit 0,30

id: 1
select_type: SIMPLE
table: table
type: index
possible_keys: NULL
key: field5
key_len: 768
ref: NULL
rows: 223636
Extra: Using where

6 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

根据您的数据更改量,您可以使用memcached来减少某个查询需要运行的次数,并缩短大多数用户的响应时间。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这张桌子有PK吗? Select field1,field2,field3 from table as a join (select PK from table WHERE field4 = '$value' ORDER BY field5 ASC limit $offset, 30) as b on a.PK=b.PK;

答案 4 :(得分:0)

您是否考虑过创建另一个表(表6)作为table4的索引哈希?搜索数字而不是文本会更快,因此查询类似于:

SELECT field1,field2,field3 Force Index(Table6)FROM table WHERE字段6 ='$ hashvalue'和field4 ='$ value' ORDER BY field5 ASC限制$ offset,30;

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

答案 5 :(得分:0)

它应该有索引“B-TREE (field4, field5)”。 该索引将允许 MySQL 使用 field4 查找记录并限制它们在 field5 上的顺序。