数据库查询速度提升

时间:2011-05-14 10:58:21

标签: mysql performance

我有以下表结构

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

2 个答案:

答案 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子句。如果您必须获得一致的结果,请在单个事务中执行所有零碎选择。