- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
MySQL 的内置缓存确实让这个问题在一天中的大部分时间里都毫无意义,但是第一次运行以下查询时,性能很糟糕:第一次花费了 300 秒以上,而后续查询则花费了 300 秒以上的时间查询可以在几毫秒内完成。使用 SQL_NO_CACHE 运行此命令需要 2-4 秒(!),这在本例中是非常可以接受的——但初始运行时间则不然。
SELECT DATEDIFF( bt.`datetime`, st.`datetime`) AS 'day_separation'
FROM `smallerTable` AS st
LEFT OUTER JOIN `bigTable` AS bt ON bt.item_id = st.item_id
AND bt.code = 'X'
AND bt.`datetime` > st.`datetime`
AND DATEDIFF ( bt.datetime, st.datetime) < 11
AND st.`datetime` > '2012-07-01' AND st.`datetime` < 'yesterdays-date 23:59:59'
我已经引入了多列索引( thanks to this question ),但它仍然无法解决这个特定问题。 This solution看起来很受启发,但我认为它不适用,因为我不确定如何合并这些结果。
较小的表有大约 8000 条记录,我现在想计算/包括所有这些记录。它最终会变得更大并包含 2012 年 7 月 1 日之前的项目。
bigTable 有 1000 万条记录,我只想将这些记录的“配对”与较小的表相匹配。部分问题是他们无法共享将它们链接在一起的直接 key 或引用,因此我留下了 LEFT OUTER JOIN
并猜测如果两个事件的时间戳相距 < 11 天(并且共享其他条件),那么它们一定是相关的。
排除测试DATEDIFF ( bt.datetime, st.datetime) < 11
创建了 14k 个“结果”,说明 DATEDIFF
的数量“需要发生”的计算是 14k-8k(又名 6k)。
索引:datetime
每个表的字段,code
,以及item_id
s。
我在两个表上都有复合索引,顺序为 (item_id, datetime)
。根据我的理解,这是必要的顺序,因为我们在 select 语句中以 DATEDIFF( bt.datetime, st.datetime)
的形式使用日期时间字段。 .
是否会在 (code, item_id, datetime)
上建立组合索引彻底改变这个查询?(是的,确实如此!)
对于我未经训练的人来说,这个解释没有透露什么,除了它使用了一个临时表,我知道这可能很耗时。
id * select_type * table * type * possible_keys * key * key_len * ref * rows * extra
1 * SIMPLE * st * index * NULL * items_for_datetime * 59 * NULL * 8295 * using index; using temporary; using filesort
1 * SIMPLE * BT * ref * [many] * items_for_datetime * 51 * master.st.item_id * 3 *
根据MySQL的突发奇想,bigTable有时显示它更喜欢 item_id
按键 items_for_datetime
。我是否应该相信我更了解而鼓励使用我的联合索引?
一些额外信息:
Check Table
, Defragmentation
,和Optimize Table
在英国电信[aside]这是否是使用 Mongo 等 NoSQL 数据库的好方案?
为什么第一轮和第二轮会有这么大的差距?更重要的是:可以采取哪些措施来改善首次运行的时机?
更新:新的尝试需要新的一天才能发现其功效。明天我将使用 BETWEEN
尝试 Barmar 的建议。和DATE_ADD
。我还在 (code, item_id, datetime)
上创建了一个组合索引。我将在明天报告结果,但欢迎任何其他想法。
更新:成功!第一次运行查询现在只花费了 6 秒,考虑到它的来源,这是令人惊奇的。后续查询只用了0.035秒!真是个梦啊。综合指数(code, item_id, datetime)
毫无疑问,这一成功也功不可没。这是新的查询:谢谢大家!
SELECT DATEDIFF( bt.`datetime`, st.`datetime` ) AS 'day_separation'
FROM `smallerTable` AS st
LEFT OUTER JOIN bigTable AS bt USE INDEX ( `cmd_item_time` )
ON bt.item_id = st.item_id
AND bt.code = 'X'
AND bt.`datetime` BETWEEN st.`datetime` AND DATE_ADD( st.`datetime`, INTERVAL 10 DAY )
AND st.datetime BETWEEN '2012-07-01' AND 'yesterdays-date 23:59:59'
最佳答案
尝试改变:
AND bt.`datetime` > st.`datetime`
AND DATEDIFF ( bt.datetime, st.datetime) < 11
至:
AND bt.`datetime` BETWEEN st.`datetime` AND date_add(st.`datetime`, interval 11 day)
这可能允许使用 bt.datetime
上的索引。
如果 code = 'X'
过滤掉 bigTable
的大部分内容,(code, item_id)
上的复合索引应该会有所帮助。
关于MySQL; LEFT OUTER 在 DATEDIFF 上加入索引需要 300 多秒(但只是第一次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16018131/
我想对 JOIN 进行特定的排序 SELECT * FROM (lives_in as t1 NATURAL JOIN preferences p1) l1 JOIN (lives_in t2 NAT
我正在努力解决一个查询。并想知道是否有人可以提供帮助。 我有一个标签表(服务请求票)和序列号表 从我的标签中我正在这样做 Select * from tag where tag.created BET
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我有两个表 tbl_user 和 tbl_lastchangepassword,如下所示 表 tbl_user id| name --------- 1 | user1 2 | user2 3 |
我有下一个问题 SELECT i.*, gu.* vs.* FROM common.global_users gu LEFT JOIN common.global_users_perms gup ON
我有一个电影表和一个投票表。用户为他们喜欢的电影投票。我需要显示按电影总票数降序排列的电影列表。我现在所拥有的有点作品。唯一的问题是它不显示 0 票的电影。 SELECT m.name, m.imdb
我有一个由这样的表组成的 mySql 数据库: 我如何(如果可能的话)使用 JOINS 从名称/周期表中获取结果?简单来说,它是如何工作的?我向菜鸟问题道歉。我对此很陌生。任何帮助将不胜感激。 最佳答
我需要查询单元先决条件的自引用关系。 我知道您需要使用两个联接,我是否选择我的列然后将其联接到自身? SELECT u.unit_code, u.name + ' is a prerequisi
我有两个实体,用户和友谊,它们看起来像: public class User { public int UserId { get; set; } (..
假设我有两个表: Table A ProdID | PartNumber | Data... 1 | ABC-a | "Data A" 2 | (null) |
说我有这个数据, (df <- data.frame( col1 = c('My','Your','His','Thir'), col2 = c('Cat','Dog','Fish','Dog')))
我有两个这样的数组,实际上这是从两个不同的服务器检索的 mysql 数据: $array1 = array ( 0 => array ( 'id' => 1, 'n
我的数据库中有以下表格 CREATE TABLE [author_details] ( [_id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [name
我正在努力使用一个相当简单的 sql select 语句的 join/where 子句。 我正在尝试从 tb1 中检索产品信息列表,其中 where 条件位于 tbl2 中,但这必须由三个不同的列连接
我正在寻找以下功能: Applicative f => f (f a) -> f a Hoogle给我看join : >:t join join :: Monad m => m (m a) -> m
我有两个“表”,分别是 USER 和 CONGE。在表“CONGE”中,我插入了用户的 ID。但是我不知道如何根据用户的id显示用户的休假。 我想根据id发布“Congé”。 { "conge"
我们有一个具有(简化)结构的文档,如Elasticsearch所示: { _id: ..., patientId: 4711, text: "blue" } { _id: ..., patientId
这两个sql语句有什么区别 a) 从 T1,T2 中选择 *,其中 T1.A=T2.A ; b) 从 T1,T2 中选择 *,其中 T2.A=T1.A ; 在这两种情况下我得到相同的输出,这两种语句之
我想做一个简单的连接,只是比较两个表中的 ID.. 我有我的组表,包含; 身份证 姓名 等.. 我的 GroupMap 表包含; 身份证 组号 元素编号 我的查询采用 GroupMap.ItemID
所以我有一组主要数据,如下所示: value_num code value_letter 1 CDX A 2 DEF B
我是一名优秀的程序员,十分优秀!