【问题标题】:Database query speed improvement数据库查询速度提升
【发布时间】:2011-05-14 20:03:55
【问题描述】:

我有如下表结构

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 连接器,并且正在从 java 代码/eclipse 执行此查询。 我可以提高这个速度吗?
如果尝试直接在 phpMyAdmin 中执行查询,我会得到以下时间结果:

总共记录 18,869 条时间:0.4204 秒

SELECT term, idf.idf
FROM idf
JOIN term ON term.id = idf.term_id
WHERE concept_id = 4

【问题讨论】:

  • term_id 和 concept_id 是否被索引?
  • Java 应用程序和 MySQL 是否在同一台机器上运行?您如何衡量应用程序中的查询执行时间?
  • 没有没有索引。 System.currentTimeMillis() 我用于那个
  • 是的,是同一台机器。我在笔记本电脑上运行它
  • 嘿,在 phpMyAdmin 中建立索引后,现在以下是 nr 记录的结果:18,869 次:0.1288 秒,这是一个相当大的改进仍然在 eclipse 中,我的查询时间约为 3 秒。我不明白:(

标签: mysql performance


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

【讨论】:

    【解决方案2】:

    在 term_id、concept_I'd 的表上创建正确的索引

    【讨论】:

    • 在 phpMyAdmin 中,以下是现在 nr 记录的结果:18,869 次:0.1288 秒,这是一个相当大的改进仍然在 Eclipse 中,我的查询时间约为 3 秒
    • @bogdan:这可能意味着数据库会在 0.13 秒内找到它们,但随后需要整整 3 秒才能将行推送到您的应用程序。
    • 是的,我也在考虑这个问题,但我不知道是什么问题..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多