大约有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
答案 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 上的顺序。