【问题标题】:Tweak mysql server for a single large-table query为单个大表查询调整 mysql 服务器
【发布时间】:2014-05-08 12:13:14
【问题描述】:

我有一个非常特殊的用例。我在一个单独的 VM 上(我刚刚投入了 8GB 内存)上有我的生产数据库(MySQL 5.5.29,InnoDB)的副本,并且只需要一个查询的结果,这需要很长时间。

这是查询:

select *
from bew 
inner join bewa on bewa.id = bew.id
inner join sa on bew.sa_id = sa.id
inner join revinfo ri on bewa.rev = ri.id
where sa.vp_id = 6
  and bewa.prio is not null
  and bewa.rev > 0
  and bew.person_id > 0
order by bew.person_id, bewa.rev, bewa.prio

这些是列类型:

bew.id           bigint(20)       [PRIMARY KEY, NOT NULL]
bew.person_id    bigint(20)       [(FOREIGN) KEY, NOT NULL - index: fk_bew_person26]
bew.sa_id        bigint(20)       [(FOREIGN) KEY, NOT NULL - index: fk_bew_sa27]
bewa.id          bigint(20)       [NOT NULL (bewa.id, bewa.rev) = PRIMARY KEY]
bewa.rev         bigint(20)       [NOT NULL (bewa.id, bewa.rev) = PRIMARY KEY, (FOREIGN) KEY - index: fk_bew_aud_revinfo28]
bewa.prio        int(11)          [index: tmp_idx_bewa_prio]
ri.id            bigint(20)       [PRIMARY KEY, NOT NULL]
sa.id            bigint(20)       [PRIMARY KEY, NOT NULL]
sa.vp_id         bigint(20)       [(FOREIGN) KEY, NOT NULL - index: fk_sa_vp141]

以上所有列都被索引为 PRIMARY KEY 或单列索引。 到目前为止还没有复合索引(我尝试了一些,但计划没有改变,所以我再次放弃了它们)。

还有一些数字:

select count(*) from sa where sa.vp_id = 6;
> 179

select count(*) from bew;
> 240808

select count(*) from bew 
inner join sa on bew.sa_id = sa.id 
where sa.vp_id = 6 and bew.person_id > 0;
> 199955

select count(*) from bewa
> 5126493

select count(*)
from bew 
inner join bewa on bewa.id = bew.id
inner join sa on bew.sa_id = sa.id
inner join revinfo ri on bewa.rev = ri.id
where sa.vp_id = 6
  and bewa.prio is not null
  and bewa.rev > 0
  and bew.person_id > 0;
> (still counting after 10 min ... :( )

这是解释输出:

****************************** 1. 行 ************************ ******* 编号:1 选择类型:简单 表:bew 类型:全部 可能键:主键,fk_bew_person26,fk_bew_sa27 键:空 key_len:空 参考:空 行数:241594 额外:使用where;使用临时的;使用文件排序 ****************************** 2. 行 ******************** ******* 编号:1 选择类型:简单 表:sa 类型:eq_ref 可能键:主键,fk_sa_vp141 关键:主要 关键长度:8 参考: bew.sa_id 行数:1 额外:使用 where *************************** 3. 行 ********************* ******* 编号:1 选择类型:简单 表:贝瓦 类型:参考 可能的键:PRIMARY,fk_bew_aud_revinfo28,tmp_idx_bewa_prio 关键:主要 关键长度:8 参考: bew.id 行数:6 额外:使用 where ****************************** 4. 行 ******************** ******* 编号:1 选择类型:简单 表:里 类型:eq_ref 可能的键:主要 关键:主要 关键长度:8 参考:bewa.REV 行数:1 额外的:

实际上我无法优化 SQL(这是相当多的数据,我需要对其进行排序......),因为我只需要运行一次,这并不重要,无论如何。

因此,只需将此查询作为我实际的更广泛的问题的示例:

如何调整我的my.cnf 文件中的设置以使此类(报告)查询比现在运行得更快?实际上,我想要的是给单个会话尽可能多的内存来执行单个查询。我不需要查询缓存或良好的多用户性能之类的东西。给定大约 6GB 的可用内存,我如何配置 mysql 服务器以尽可能多地使用它来计算单个查询?

【问题讨论】:

  • 什么数据库引擎?任何返回的列 blob 或文本?你有sa.vp_id 的索引吗?
  • 更多细节见上文。创新数据库。返回的集合中没有 blob 或文本列。查询中使用的每一列都有一个索引。我还添加了表格大小。

标签: mysql innodb


【解决方案1】:

好的,我已经用谷歌搜索并进行了一些实验。我在my.cnf中设置了以下值:

innodb_buffer_pool_size = 768M
sort_buffer_size        = 64M 
key_buffer_size         = 64M
read_buffer_size        = 64M

这使我的查询时间缩短到 20 分钟,这对我来说还可以。

一些参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2016-07-20
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多