我正在尝试从我的表中处理数百万条记录(大小约为30 GB),我目前正在使用分页(mysql 5.1.36).我在for循环中使用的查询是
select blobCol from large_table
where name= 'someKey' and city= 'otherKey'
order by name
LIMIT <pageNumber*pageSize>, <pageSize>
Run Code Online (Sandbox Code Playgroud)
这适用于大约500K记录.我使用的页面大小为5000,在第100页之后,查询开始显着减慢.第一〜80页中提取2-3秒,但大约130页之后,每个页面大约需要30秒来检索,至少要等到页面200我的一个查询的大约有900页,这将花费太长时间.
The table structure is (type is MyISAM)
name char(11)
id int // col1 & col2 is a composite key
city varchar(80) // indexed
blobCol longblob
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能加快速度?查询的解释显示了这一点
select_type: SIMPLE
possible_keys: city
key : city
type: ref
key_len: 242
ref: const
rows: 4293720
Extra: using where; using filesort
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,我的服务器my.cnf(24 GB RAM,2四核处理)有这些条目
key_buffer_size = 6144M
max_connections = 20
max_allowed_packet = 32M
table_open_cache = …
Run Code Online (Sandbox Code Playgroud) 我想在我的Servlet/EJB/JPA-Hibernate项目中实现分页,但我无法弄清楚查询中只有一个页面如何知道我必须显示的页数
我用
setFirstResult(int first) ;
setMaxResults(int max) ;
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我怎么知道我总共会有多少页呢?
(Hibernate是我的JPA提供者,但如果可能,我更愿意只使用JPA)
更新:COUNT()似乎是更好/最简单的解决方案; 但与之SELECT COUNT(*) FROM ...
相比,
成本可能是executeQuery("SELECT * FROM ...).getListResult().size()
多少?
有人可以帮我完成/清理这个查询.我试图首先获取表中的行数,然后我需要实际获取一组行.我不确定如何使用相同的条件实例来执行两个查询.
要获取计数我有这样的事情:
Criteria criteria = session.createCriteria(MyTable.class);
criteria.setProjection(Projections.rowCount());
Integer count = (Integer) criteria.uniqueResult();
int numRows = count.intValue();
Run Code Online (Sandbox Code Playgroud)
并获取行(我只需要一个子集用于分页):
Criteria criteria = session.createCriteria(MyTable.class);
criteria.setFirstResult(offset);
criteria.setMaxResults(limit);
criteria.addOrder(Order.desc(orderBy.toString()));
List<MyType> myType = criteria.list();
Run Code Online (Sandbox Code Playgroud)
我是否首先需要将投影或类似的东西取出来以便我可以使用条件来获取行(执行计数后)?
我希望有一些帮助清理它,以便我可以有效地执行两个查询,最终得到总行数和结果列表.谢谢!!
我希望我不会写一份副本,但我找不到任何能回答我问题的内容.(虽然在我看来这是很常见的问题.)
几乎每个Web项目都会出现此问题:您有一个包含许多条目的表,并希望它们显示在单个页面上.
现在我想知道计算某组表行所需页数的最佳方法是什么.
这里有一些我一直在考虑的方法.我想对它们的效果有所回应.我将给出特定于PHP的示例,但我敢打赌其他语言中也有类似的技术.
最好的方法是静态保存页数,并在每次添加新条目时修改值.(尽管如此......我正在寻找一个动态的解决方案:-))
做一个SELECT COUNT(*)
在感兴趣的行和每次显示页面时计算的页码.
执行普通选择以获取所有行的结果集.现在不要通过调用来加载行mysql_fetch_row
,但是要获取行数mysql_num_rows
.(因为我不知道这是如何实现的,我不知道它是否有效.任何人都知道吗?)然后我可以舒服地移动结果集指针.(因为mysqli
有mysql_data_seek
,但本机MySQL扩展没有类似的功能.因此我假设这只是一些缓冲行为mysqli
)
任何人都可以说如何最有效地计算行数(页数)?