我有一个包含单个表的数据库。桌子的大小是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和内存版本提供EXPLAIN SELECT ...
您是否正在运行一个连接反复进行该查询?还是很多?还是有那么多资源使您用尽?


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

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

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

10-07 14:41