我有以下表结构
term_id int(11)
concept_id int(11)
idf double
我有大约240万的记录。当我执行以下查询
时stmt = con.prepareStatement("SELECT term, idf.idf FROM idf "
+ "JOIN term ON term.id=idf.term_id "
+ "WHERE concept_id= ?");
stmt.setInt(1, id);
res = stmt.executeQuery();
查询大约需要3秒钟。我正在使用MySQL Connector,我正在从java code / eclipse执行此查询。 我可以提高这个速度吗? 如果尝试直接在phpMyAdmin中执行查询,我会得到以下时间结果:
记录18,869总时间:0.4204秒
SELECT term, idf.idf
FROM idf
JOIN term ON term.id = idf.term_id
WHERE concept_id = 4
答案 0 :(得分:1)
创建正确的索引在term_id的表格上,concept_I'd
答案 1 :(得分:1)
问题出在这一行:
记录18,869总时间:0.4204秒
您正尝试将18,869条记录从远程主机推送到本地客户端 当然你不需要18k记录,谁是时候阅读所有这些?
所以你可能只需要前几行 或者您需要进一步处理。
排名前100行
SELECT term.*, idf.idf
FROM idf
JOIN term ON term.id = idf.term_id
WHERE concept_id = 4
ORDER BY term.id
LIMIT 100;
将数据存储在内存表中以供进一步处理
INSERT INTO mem_idfterm
SELECT term.*, idf.idf
FROM idf
JOIN term ON term.id = idf.term_id
WHERE concept_id = 4
ORDER BY term.id;
而不是从mem_idfterm进一步选择,
或使用(现在臭名昭着)选择作为子选择从中提取更多数据。
尽量不要在网络上推送超过1000行。
最后,您可以批量获取数据:
SELECT term.*, idf.idf
...
LIMIT 0, 100; -- first batch
SELECT term.*, idf.idf
...
LIMIT 100, 100; -- second batch
等
我建议在使用限制时使用order by
子句。如果您必须获得一致的结果,请在单个事务中执行所有零碎选择。