- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个存储流量数据的简单表:
CREATE TABLE `domain_traffic` (
`dtraff_id` int(10) UNSIGNED NOT NULL,
`domain_id` int(10) UNSIGNED NOT NULL,
`dtraff_time` bigint(20) UNSIGNED NOT NULL,
`dtraff_web` bigint(20) UNSIGNED DEFAULT '0',
`dtraff_ftp` bigint(20) UNSIGNED DEFAULT '0',
`dtraff_mail` bigint(20) UNSIGNED DEFAULT '0',
`dtraff_pop` bigint(20) UNSIGNED DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE `domain_traffic`
ADD PRIMARY KEY (`dtraff_id`),
ADD KEY `domain_id` (`domain_id`);
ALTER TABLE `domain_traffic`
MODIFY `dtraff_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
通过强制使用 domain_id 索引(MySQL 默认执行的操作)运行以下查询大约需要 12 秒:
SELECT SQL_NO_CACHE
SUM(dtraff_web) as web,
SUM(dtraff_ftp) as ftp,
SUM(dtraff_mail) as mail,
SUM(dtraff_pop) as pop
FROM domain_traffic FORCE INDEX (domain_id)
WHERE domain_id = 150
但是
上面相同的查询要求 MySQL 忽略 domain_id 索引只用了大约 2 秒(无论如何仍然很糟糕):
SELECT SQL_NO_CACHE
SUM(dtraff_web) as web,
SUM(dtraff_ftp) as ftp,
SUM(dtraff_mail) as mail,
SUM(dtraff_pop) as pop
FROM domain_traffic IGNORE INDEX (domain_id)
WHERE domain_id = 150
我真的很惊讶这样的结果,我真的很想知道为什么会这样......
EXPLAIN 两个查询:
使用 domain_id 索引:
+------+-------------+----------------+------+---------------+-----------+---------+-------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------------+------+---------------+-----------+---------+-------+---------+-------+
| 1 | SIMPLE | domain_traffic | ref | domain_id | domain_id | 4 | const | 2069312 | |
+------+-------------+----------------+------+---------------+-----------+---------+-------+---------+-------+
忽略 domain_id 索引
+------+-------------+----------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------------+------+---------------+------+---------+------+---------+-------------+
| 1 | SIMPLE | domain_traffic | ALL | NULL | NULL | NULL | NULL | 4138625 | Using where |
+------+-------------+----------------+------+---------------+------+---------+------+---------+-------------
备案:
有什么解释和建议吗?
谢谢。
没有优化器提示的结果(遵循@Bill Karwin 的回答):
MariaDB [imscp]> EXPLAIN
SELECT SQL_NO_CACHE
SUM(dtraff_web) as web, SUM(dtraff_ftp) as ftp,
SUM(dtraff_mail) as mail, SUM(dtraff_pop) as pop
FROM domain_traffic WHERE domain_id = 150;
+------+-------------+----------------+------+---------------+-----------+---------+-------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------------+------+---------------+-----------+---------+-------+---------+-------+
| 1 | SIMPLE | domain_traffic | ref | domain_id | domain_id | 4 | const | 2069312 | |
+------+-------------+----------------+------+---------------+-----------+---------+-------+---------+-------+
1 row in set (0.00 sec)
MariaDB [imscp]> SELECT SQL_NO_CACHE
SUM(dtraff_web) as web, SUM(dtraff_ftp) as ftp,
SUM(dtraff_mail) as mail, SUM(dtraff_pop) as pop
FROM domain_traffic WHERE domain_id = 150;
+--------------+--------------+--------------+--------------+
| web | ftp | mail | pop |
+--------------+--------------+--------------+--------------+
| 105989792928 | 106045788277 | 105954990092 | 105942540350 |
+--------------+--------------+--------------+--------------+
1 row in set (8.53 sec)
最佳答案
当您有忽略索引的 EXPLAIN 时,它表明它运行表扫描(类型:ALL)。检查的行数约为 4.1m(这只是粗略估计,不是准确计数)。
您阐明了 domain_id = 150 的约 4.1m 行。因此,实际上表中的每一行都符合您的 WHERE 条件。
想想一本书后面的索引。为什么它不包含“the”或“and”等词的条目?因为这些词几乎出现在每一页上,将它们编入索引并使用索引来查找这些常见词的出现,然后翻到相应的页面,然后翻回索引以查找下一页是浪费时间发生在第 2 页,依此类推。
与MySQL中二级索引的方式相同。如果优化器检测到您搜索的给定值太常见,它会跳过索引并只进行表扫描。当索引不能有效地缩小搜索范围以使其不值得时,在阅读索引时更容易做到这一点。
在实践中,我观察到当值出现在表中 21-25% 的行上时,优化器会跳过使用索引。通常这是一个很好的决定。很少有必要使用 FORCE INDEX 告诉优化器您不希望不惜一切代价进行表扫描。但这种情况很少见。
我的建议是:让优化器完成它的工作。它通常会根据查询逻辑和频率做出是否使用索引的正确决定您正在搜索的特定值。
回复你的评论:
如果您的生产数据允许 WHERE 条件选择表的少数子集,那么优化器应该决定是否值得使用索引。优化器的目标之一是减少 InnoDB 需要读取的已检查行的数量。
这是一个很好的例子,说明了为什么您需要使用模拟生产数据的数据进行测试。拥有不同数据值的正确比率有助于您进行实际的查询优化器测试。
还要确保使用 ANALYZE TABLE不时地确保 InnoDB 具有有关索引中数据分布的当前统计信息。我见过通过运行 ANALYZE TABLE 非常简单地修复奇怪的索引行为的情况。这是一个快速操作,即使您的表非常大也是如此。
这不必非常频繁,但如果索引中值的分布发生显着变化(例如,如果您执行主要的批量插入或批量删除),则值得在之后执行 ANALYZE TABLE。
关于MySQL - 基本索引减慢简单聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978473/
我正在使用 UISnapBehavior,但它的捕捉速度太快了,我不喜欢。有没有办法让它慢下来?或者换句话说:有没有办法用它应该捕捉的点来调整物体的弹性? 最佳答案 我能够通过将 View 附加到 U
我想减慢 SWTBot 的执行速度。 我已经找到了这个 wiki: https://wiki.eclipse.org/SWTBot/FAQ#Can_I_slow_down_the_execution_
我的应用程序中有一个计时错误,只有在我使用 valgrind 时才会发生,因为 valgrind 会大大减慢进程的速度。 (它实际上是一个我无法本地化的 boost::weak_ptr-excepti
问题 我正在创建一个涉及躲避射弹的游戏。玩家控制着一艘船的图像,我不希望船完全一起移动,因为这看起来非常不现实。 问题 有没有办法控制图像移动的速度,如何减慢图像的移动速度? 代码 var game
我在我的 iOS 应用程序中使用了 NSTimer,但由于 SetNeedsDisplay,我没有得到我想要的结果。 我做了一些研究并找到了 CADisplayLink,它为我提供了我想要的动画结果。
我目前正在开发一个项目,当按下按钮时,该项目会将圆从一个空间移动到另一个空间。我的设计如下:当按下按钮时,它会在 for 循环中从 0 到 10 增加圆的坐标。 问题是,我想要的 for 循环运动没有
我想缓慢地制作一个三色渐变动画。 我有一个自定义UIView,如下所示: class MyView: UIView, CAAnimationDelegate { lazy var gradient
当 RAM 达到 x 内存量或调用 didReceiveMemoryWarning() 时,是否有办法减慢处理器速度? func didReceiveMemoryWarning() { sup
有没有办法减慢行插入/删除动画的速度? 在我的特殊情况下,我通过在我的单元格下方添加/删除行来扩展/折叠单元格,我想稍微放慢动画速度。 最佳答案 我正在使用以下技巧在我的项目中以动画方式插入/删除表格
我的 Logo 和页脚中有 scroll-top 属性,但我离页面顶部越远,它向上滚动的速度就越快!所以当我从页面底部滚动到顶部时,它就像火箭一样!我将如何放慢速度?我找不到足够具体的答案 可以看看l
我想放慢由我的 UIDynamicAnimator 生成的动画,以便我可以微调我的 UIDynamicBehaviors。 在 ios 模拟器中,调试菜单下有一个菜单选项,标签为“在最前面的应用程序中
在 OS X 上,可以按住 Shift 键使动画变慢。有什么方法可以通过远程调试器或 Instruments 将其应用于 iOS 吗? (或者,我可以在 QuickTime 中录制并逐帧回放,但我宁愿
我想在 .opacity CSS 属性中减慢动画时间。就像,我希望它延迟 0.2 毫秒或类似的东西。 为了获得更好的想法,将鼠标悬停在我网站上的精选帖子上时会添加不透明度:http://www.the
我希望我的 UIPageViewController 在用户的手指离开屏幕时缓慢滚动到下一页。比默认情况下慢。如果可能的话,对其减速曲线等进行更多控制。 我不想使用 SCPageViewControl
我发现了这个 javascript 自动滚动函数,并通过将其粘贴到 WordPress 站点的头文件中来使其工作。但是,我想减慢滚动速度,以便它不会立即捕捉到页面底部。 我是 javascript 的
我正在使用 UIScrollView 以编程方式为某些内容设置动画。 但是,我需要减慢 View 的滚动速度。 这是我用于滚动的代码: self.scrollView.setContentOffset
我一直在使用 jQuery 滚动来增强我的视差滚动页面。具体来说就是这个。 JQuery Scroll to Next Section 我对 jQuery 完全陌生(过去只使用过一些相当基本的 Jav
如何减慢 Windows 进程? 我知道我需要 Hook QueryPerformanceCounter 但接下来我需要做什么? 需要 Delphi 或 C++ 方面的帮助 最佳答案 我不确定我是否理
我想在我这边控制下载量/速度——在服务器端也一样(礼貌一点)。...不是“我自己的下载管理器”。 让我们想象一下:我允许我的儿子每天从 utube 下载最多 500Mb,但他仍然启动了一个 sessi
在我的网站上,我有多个 href's,我需要在点击它们和加载它们之间添加延迟。由于有数百个 hrefs,我不能为每个单独的 js 函数。 我研究过的两种方法是,将 href 的内容作为变量传递给 ja
我是一名优秀的程序员,十分优秀!