【问题标题】:MYSQL InnoDB:why performance after increasing the buffer pool size isn't even close to the MEMORY engine?MYSQL InnoDB:为什么增加缓冲池大小后的性能甚至不接近 MEMORY 引擎?
【发布时间】:2018-02-23 06:56:31
【问题描述】:

我有一个包含一个表的数据库。表的大小是 3.5 Gs。

我正在使用三种不同的配置对表进行只读查询:
1- Innodb 默认缓冲池大小。
2- Innodb 缓冲池大小 = 6G。
3-内存引擎。

三种不同配置的运行时间:
1- 默认缓冲池大小 .... 15,53 秒。
2- 缓冲池大小 = 6G ...... 13,60 秒。
3- 内存引擎 .... 3,96 秒。
……

如果增加缓冲池大小会使数据库像“内存中”数据库......为什么内存引擎和缓冲池之间存在巨大差距,有足够大的空间来包含表。

笔记:
1-我正在专用机器上进行实验。

2-当使用 6Gs 的缓冲池时....没有交换发生,所以表很适合内存..没有交换。

3-我不止一次进行查询以确保将“热数据”加载到主内存中......我正在观察内存消耗......在进行查询后它从 500 MB 到 4G 左右...... ..缓冲池6G设置。

4- 使用此命令创建的表:

CREATE TABLE lineitem ( 
L_ORDERKEY    INTEGER NOT NULL,
L_PARTKEY     INTEGER NOT NULL,
L_SUPPKEY     INTEGER NOT NULL,
L_LINENUMBER  INTEGER NOT NULL,
L_QUANTITY    DECIMAL(15,2) NOT NULL,
L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL,
L_DISCOUNT    DECIMAL(15,2) NOT NULL,
L_TAX         DECIMAL(15,2) NOT NULL,
L_RETURNFLAG  CHAR(1) NOT NULL,
L_LINESTATUS  CHAR(1) NOT NULL,
L_SHIPDATE    DATE NOT NULL,
L_COMMITDATE  DATE NOT NULL,
L_RECEIPTDATE DATE NOT NULL,
L_SHIPINSTRUCT CHAR(25) NOT NULL,
L_SHIPMODE     CHAR(10) NOT NULL,
L_COMMENT VARCHAR(44) NOT NULL);


5-我正在运行的查询,(即)tpch的查询6

select
sum(l_extendedprice * l_discount) as revenue
from
  tpch2.lineitem
where
   l_shipdate >= date '1994-01-01'
   and l_shipdate < date '1994-01-01' + interval '1' year
   and l_discount between 0.06 - 0.01 and 0.06 + 0.01
   and l_quantity < 24;

【问题讨论】:

  • 您在使用 InnoDB 时是否尝试添加像 ALTER TABLE lineitem ADD INDEX shipdate_discount_quantity (l_shipdate, l_discount, l_quantity); 这样的索引?如果不能,你能做到并报告测试时间结果吗?
  • @codtex ,非常感谢您的评论。不,我没有编制索引。
    建立索引:
    默认缓冲池大小时间:15,65 秒
    缓冲池大小 = 6G:13,32 秒
  • 所以我看不出有没有索引有任何区别......这很奇怪。也许您可以尝试在您的选择语句上使用EXPLAIN,无论如何,我似乎正在尝试帮助提高查询速度而不是回答实际问题“为什么内存引擎和缓冲池有足够大的空间来容纳这些表吗?”。我可以给出的其他建议是尝试使用PARTITIONING,同时阅读this

标签: mysql performance memory innodb olap


【解决方案1】:
  • 是否有没有个索引?或者表格是否有 INDEX(l_shipdate)INDEX(l_discount)INDEX(l_quantity) 以便优化器可以从中挑选?
  • 请为 InnoDB 和 Memory 版本提供 EXPLAIN SELECT ...
  • 您是否正在运行一个连接重复执行该查询?还是很多?还是太多了,以至于您正在用尽资源?

INDEX(l_shipdate, l_discount, l_quantity) 没有好处,因为优化器实际上不能处理多个“范围”,并且WHERE 的每个部分都是一个“范围”。

我很惊讶速度比超过 3:1。内存必须进行表扫描,测试每一行。 InnoDB,我建议使用 3 个索引可能使用索引。这取决于数据的分布。说到这个,该日期范围内有多少行?在那个折扣范围内?在那个数量范围内?

您是否每次计时两次?第一次会有 I/O,但是“预热缓存”;第二个(大概)没有 I/O。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    相关资源
    最近更新 更多