- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个星型模式,作为我正在构建的分析应用程序的后端。我的查询生成器正在使用常规星型连接模式构建查询。下面是一个示例查询,其中一个事实表连接到两个维度表,维度表按最终用户选择的常量值进行过滤。
我使用的是 MySQL 5.5,所有表都是 MyISAM。
在这个问题中,我只是想拉取前 N 行(在本例中为前 1 行)
EXPLAIN
SELECT fact_table.*
FROM
fact_table
INNER JOIN
dim1 ON (fact_table.dim1_key = dim1.pkey)
INNER JOIN
dim2 ON (fact_table.dim2_key = dim2.pkey)
WHERE
dim1.constant_value = 123
AND dim2.constant_value = 456
ORDER BY
measure1 ASC LIMIT 1
解释输出如下。两个维度键都解析为常量值,因为它们的值应用了一个唯一键。
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: dim1
type: const
possible_keys: PRIMARY,dim1_uk
key: dim1_uk
key_len: 8
ref: const
rows: 1
Extra: Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: dim2
type: const
possible_keys: PRIMARY,dim2_uk
key: dim2_uk
key_len: 8
ref: const
rows: 1
Extra:
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: fact_table
type: ref
possible_keys: my_idx
key: my_idx
key_len: 16
ref: const,const
rows: 50010
Extra: Using where
这是事实表的索引:
show indexes from fact_table
*************************** 10. row ***************************
Table: fact_table
Non_unique: 1
Key_name: my_idx
Seq_in_index: 1
Column_name: dim1_key
Collation: A
Cardinality: 24
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 11. row ***************************
Table: fact_table
Non_unique: 1
Key_name: my_idx
Seq_in_index: 2
Column_name: dim2_key
Collation: A
Cardinality: 70
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 12. row ***************************
Table: fact_table
Non_unique: 1
Key_name: my_idx
Seq_in_index: 3
Column_name: measure1
Collation: A
Cardinality: 5643
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
分析此查询时,我发现查询大部分时间都在执行文件排序操作“排序结果”。我的问题是,即使使用了正确的索引,为什么这个查询不能在不进行排序的情况下简单地提取第一个值? my_idx 已在右列排序,索引中首先出现的两列解析为常量,如计划所示。
如果我重写查询,如下所示,我能够得到我想要的计划,没有文件排序。
SELECT fact_table.*
FROM
fact_table
WHERE
dim1_key = (select pkey from dim1 where constant_value = 123)
AND dim2_key = (select pkey from dim2 where constant_value = 456)
ORDER BY
measure1 ASC LIMIT 1
更改生成这些 SQL 命令的工具会很昂贵,因此即使查询是以原始格式编写的,我也想避免这种文件排序。
我的问题是,即使索引上的第一个键是常量(通过 INNER JOIN)并且索引按正确顺序排序,为什么 MySQL 仍选择执行文件排序?有解决办法吗?
最佳答案
My question is, why is MySQL opting to do a filesort even when the first keys on the index are constants (via an INNER JOIN) and the index is sorted in the right order? Is there a way around this?
因为结果集的顺序取决于用于读取 JOIN 中第一个表的索引,但是,正如您在 EXPLAIN 中看到的,JOIN 实际上是从 dim1
表开始的。
这可能看起来很奇怪,但是要隐式地强制 MySQL 从 fact_table
开始,您需要将维度表中的索引更改为 (pkey, constantvalue) 而不是 (constantvalue),否则 MySQL 优化器将从条件 constantvalue=some_value
返回最少行数的表开始。问题是您可能需要这些索引来进行其他查询。
相反,您可以尝试将 STRAIGHT_JOIN 选项添加到 SELECT 并明确强制顺序。
关于对于单行结果集,MySQL 查询停留在 "Sorting Result",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19689812/
这是我的代码 />100 1000 它不按要求工作.. 当提交表单时(并且在任何错误情况下)它返回到默认选中的单选按钮,即值 = 1000 用户必须再次单击值 = 100,而目标是,如果用户选择了 1
假设我有一个透明的红色 HTML 元素。当我悬停该元素时,它应该变成纯红色。当我停止悬停该元素时,它应该动画回到第一个状态,但仅在 X 秒后。 到目前为止一切顺利,请参阅代码片段。 我的问题是当我停止
我遇到了 cookie 情况,我的 cookie 会存储一个颜色名称或根本不存储任何内容。所以让我们这样解释吧。我的 cookie 与我网站的外观有关,我的网站有 3 种外观: 正常(完全没有 coo
这是我的问题。我有一张包含三个 div 的 Bootstrap v4 卡。 A 是最重要的一个,我希望它保持在左上角。 当页面较宽时,我希望 B 和 C 在 A 的右侧。 当页面变窄时,卡片缩小,C
示例表: uid time_stp traf 1 2016-01-13 00:00:00 6 1 2016-01-13 05:00:00 8 1
我是一名优秀的程序员,十分优秀!