【问题标题】:MySQL: How to speed up insert and group by query of very large table (74m rows)MySQL:如何通过查询非常大的表(74m 行)加速插入和分组
【发布时间】:2014-03-24 05:12:07
【问题描述】:

我正在尝试运行以下查询,这需要几个小时。我们有一个用于查询的专用服务器(不在本地主机上运行)。

这是一个包含大约 7400 万行的 InnoDB 表。我已经对分组中涉及的两列(TRAN_URN,UCI)进行了索引,希望能够加快查询速度。

insert into data.urn_uci_lookup (TRAN_URN, UCI, `Count`)
select  TRAN_URN,UCI, count(*) as `Count`
from data.diablo18
group by TRAN_URN, UCI

这是因为某种原因效率低下吗?我该如何改进它?

编辑:这是解释计划

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE diablo18 ALL \N \N \N \N 74631102 使用临时;使用文件排序

干杯, 卢卡斯

【问题讨论】:

  • 解释计划告诉你什么?
  • 嗨,吉姆,我到底该如何使用它?以前从未使用过 EXPLAIN PLAN...
  • 解释计划添加到原帖
  • 只在查询的选择部分执行 EXPLAIN EXTENDED。
  • 最大的问题是索引的基数,或者相反,您期望在count(*) 列中的数字。如果您期望count(*) 中的大多数行的结果非常低(即(TRAN_URN,UCI) 有多少个不同的值?

标签: mysql performance insert


【解决方案1】:

此查询将读取全部 7400 万行。它还将在新表中重新创建大部分表,具体取决于您拥有的组数。

我们没有足够的关于您的服务器或数据集的信息来做很多事情,但只能做出有根据的猜测。

您想查看您的 innodb 配置,尤其是您为其分配了多少内存(应该几乎是服务器可用 RAM 的全部,越多越好)减去基本开销所需的内存,如所述在https://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html

您的服务器 io 子系统可能是瓶颈。如果 IO 很慢,服务器可能只是试图跟上该查询所需的读/写。设置高性能数据库服务器比在“专用”机器上安装 mysql 服务器要复杂得多。

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多