繁体   English   中英

MYSQL InnoDB:为什么增加缓冲池大小后的性能甚至不接近MEMORY引擎?

[英]MYSQL InnoDB:why performance after increasing the buffer pool size isn't even close to the MEMORY engine?

我有一个包含单个表的数据库。 桌子的大小是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;
  • 没有索引吗? 还是该表具有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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM