- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的表结构:
CREATE TABLE `channel_play_times_bar_chart` (
`playing_date` datetime NOT NULL,
`channel_report_tag` varchar(50) NOT NULL,
`country_code` varchar(50) NOT NULL,
`device_report_tag` int(11) NOT NULL,
`greater_than_30_minutes` decimal(10,0) NOT NULL,
`15_to_30_minutes` decimal(10,0) NOT NULL,
`0-15_minutes` decimal(10,0) NOT NULL,
PRIMARY KEY (`country_code`,`device_report_tag`,`channel_report_tag`,`playing_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
当我运行以下查询时:
EXPLAIN EXTENDED
SELECT
channel_report_tag,
SUM(`greater_than_30_minutes`) AS '>30 minutes',
SUM(`15_to_30_minutes`) AS '15-30 Minutes',
SUM(`0-15_minutes`) AS '0-15 Minutes'
FROM
channel_play_times_bar_chart USE INDEX (ABCDE)
WHERE country_code = 'US'
AND device_report_tag = 14
AND channel_report_tag = 'DUNYA NEWS'
AND playing_date BETWEEN '2016-09-01'
AND '2016-09-13'
GROUP BY channel_report_tag
ORDER BY SUM(`greater_than_30_minutes`) DESC
LIMIT 10
这是我得到的输出(在另一个选项卡中打开它):
索引定义为:
CREATE INDEX ABCDE
ON channel_play_times_bar_chart (
`country_code`,
`device_report_tag`,
`channel_report_tag`,
`playing_date`,
`greater_than_30_minutes`
)
我在这里有点困惑; key
列显示 ABCDE 被用作 index
,而 ref
列显示 NULL
。这是什么意思 ?索引是否实际被使用?如果不是,我做错了什么?
最佳答案
它正在使用您在 create index
中显示的 key , 即 ABCDE
.如果你做了一个就好了
show create table channel_play_times_bar_chart
然后一次全部显示出来。该键可能对您没有多大用处,因为它复制了您相当广泛的主键已经为您提供的大部分内容。
一旦查询使用到复合键的第 3 段的键,它就会以 WHERE
恢复。范围在 playing_date
在该组合中找到 8 行。
备注EXPLAIN
是一个估计值。
此外,我会重新考虑您的 PRIMARY KEY
的策略( PK
) 想法,特别是考虑到您决定通过创建 ABCDE
来或多或少地欺骗它.这意味着您正在维护两个索引,而第二个索引几乎没有任何收获(您将一列添加到二级索引 ABCDE
)。
PK
它相当宽(我相信是 118 字节)。它规定了物理顺序。如果在构建事物的整个过程中都使用这个想法,那么这个想法很容易成为一个糟糕的想法。通过 UPDATE
对数据所做的更改影响 PK
中的列强制重新调整表的物理顺序。这个事实很好地说明了为什么 id INT AUTO_INCREMENT PRIMARY KEY
通常用作最佳实践用例,因为它永远不会经历重新洗牌并且很薄(4 字节)。
键的宽度及其与引用(其他)表(在外键约束中)的策略会影响键大小和查找性能。宽键可以显着减慢该过程。
这并不是说您不应该在这些列上设置键,例如您的二级索引 ABCDE
.但总的来说,这对于 PK
不是一个好主意。 .
请注意,可以认为 ABCDE
永远不会给你任何 PK 的好处,因为范围查询在接近尾声时停止使用它,即 WHERE
一旦达到日期,就会超出范围。只是一个想法。
文章 Using EXPLAIN to Write Better MySQL Queries 是一篇不错的读物,而且相当简短。 .
关于MySQL : Using EXPLAIN keyword to know about indexing.(特定用例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615992/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!