- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个有时完美运行的连接查询我从 EventKeyReference 表中获取 eventKey、label 和 dataUnit,从 EventData 中获取 valueParam,从表 EventHeader 中获取时间戳。在我的 where 子句中,我有 Unit u.id = 3。这很好用。但是,当我尝试搜索 Unit u.id = 1 时,查询有时可能需要长达 20 秒。
搜索 id = 3
SELECT ek.eventKey, ek.label, ek.dataUnit, ed.valueParam, eh.timestamp
FROM EventKeyReference AS ek
INNER JOIN UnitReference_EventKeyReference AS urek ON urek.eventKeyReferences_id = ek.id
INNER JOIN UnitReference AS ur ON ur.id = urek.UnitReference_id
INNER JOIN Unit AS un ON un.id = ur.unit_id INNER JOIN User AS u ON u.id = ur.user_id
INNER JOIN EventData AS ed ON ek.eventKey = ed.keyParam
INNER JOIN EventHeader AS eh ON eh.id = ed.eventHeader_id
WHERE ek.eventKey = 'C004' AND u.id = 3 AND un.serialNumber=221148096
ORDER BY eh.timestamp LIMIT 1;
给出这个:
+----------+----------+----------+------------+---------------------+
| eventKey | label | dataUnit | valueParam | timestamp |
+----------+----------+----------+------------+---------------------+
| C004 | Utgang 2 | on/off | 0 | 2000-01-01 00:01:04 |
+----------+----------+----------+------------+---------------------+
1 row in set (0.00 sec)
搜索 id = 1 得到这个:
+----------+-------------+----------+------------+---------------------+
| eventKey | label | dataUnit | valueParam | timestamp |
+----------+-------------+----------+------------+---------------------+
| C004 | DigitalOut1 | ON/OFF | 0 | 2000-01-01 00:01:04 |
+----------+-------------+----------+------------+---------------------+
1 row in set (16.04 sec)
如您所见,执行查询需要 16 秒。
在检查 EXPLAIN SELECT 时,我明白了。
mysql> EXPLAIN SELECT ek.eventKey, ek.label, ek.dataUnit, ed.valueParam, eh.timestamp FROM EventKeyReference AS ek INNER JOIN UnitReference_EventKeyReference AS urek ON urek.eventKeyReferences_id = ek.id INNER JOIN UnitReference AS ur ON ur.id = urek.UnitReference_id INNER JOIN Unit AS un ON un.id = ur.unit_id INNER JOIN User AS u ON u.id = ur.user_id INNER JOIN EventData AS ed ON ek.eventKey = ed.keyParam INNER JOIN EventHeader AS eh ON eh.id = ed.eventHeader_id WHERE ek.eventKey = 'C004' AND u.id = 1 AND un.serialNumber=221148096 ORDER BY eh.timestamp DESC LIMIT 1;
+----+-------------+-------+--------+-----------------------------------------------+--------------------+---------+------------------------------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-----------------------------------------------+--------------------+---------+------------------------------------+--------+----------------------------------------------+
| 1 | SIMPLE | u | const | PRIMARY | PRIMARY | 8 | const | 1 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | eh | index | PRIMARY | eh_timestamp | 9 | NULL | 169161 | Using index |
| 1 | SIMPLE | ed | ref | FK794A194417A622D6 | FK794A194417A622D6 | 9 | fltcoor.eh.id | 5 | Using where |
| 1 | SIMPLE | ur | range | PRIMARY,FK83382A0747140EFE,FK83382A073EC5085E | FK83382A0747140EFE | 9 | NULL | 3 | Using where; Using join buffer |
| 1 | SIMPLE | urek | ref | PRIMARY,FKAC98AB0E2DFCBD8F,FKAC98AB0E564AEB96 | FKAC98AB0E564AEB96 | 8 | fltcoor.ur.id | 11 | Using index |
| 1 | SIMPLE | un | eq_ref | PRIMARY,serialNumber | PRIMARY | 8 | fltcoor.ur.unit_id | 1 | Using where |
| 1 | SIMPLE | ek | eq_ref | PRIMARY | PRIMARY | 8 | fltcoor.urek.eventKeyReferences_id | 1 | Using where |
+----+-------------+-------+--------+-----------------------------------------------+--------------------+---------+------------------------------------+--------+----------------------------------------------+
7 rows in set (0.00 sec)
mysql> EXPLAIN SELECT ek.eventKey, ek.label, ek.dataUnit, ed.valueParam, eh.timestamp FROM EventKeyReference AS ek INNER JOIN UnitReference_EventKeyReference AS urek ON urek.eventKeyReferences_id = ek.id INNER JOIN UnitReference AS ur ON ur.id = urek.UnitReference_id INNER JOIN Unit AS un ON un.id = ur.unit_id INNER JOIN User AS u ON u.id = ur.user_id INNER JOIN EventData AS ed ON ek.eventKey = ed.keyParam INNER JOIN EventHeader AS eh ON eh.id = ed.eventHeader_id WHERE ek.eventKey = 'C004' AND u.id = 3 AND un.serialNumber=221148096 ORDER BY eh.timestamp DESC LIMIT 1;
+----+-------------+-------+--------+-----------------------------------------------+--------------------+---------+------------------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-----------------------------------------------+--------------------+---------+------------------------------------+------+-------------+
| 1 | SIMPLE | u | const | PRIMARY | PRIMARY | 8 | const | 1 | Using index |
| 1 | SIMPLE | eh | index | PRIMARY | eh_timestamp | 9 | NULL | 1 | Using index |
| 1 | SIMPLE | ur | ref | PRIMARY,FK83382A0747140EFE,FK83382A073EC5085E | FK83382A0747140EFE | 9 | const | 2 | Using where |
| 1 | SIMPLE | un | eq_ref | PRIMARY,serialNumber | PRIMARY | 8 | fltcoor.ur.unit_id | 1 | Using where |
| 1 | SIMPLE | ed | ref | FK794A194417A622D6 | FK794A194417A622D6 | 9 | fltcoor.eh.id | 5 | Using where |
| 1 | SIMPLE | urek | ref | PRIMARY,FKAC98AB0E2DFCBD8F,FKAC98AB0E564AEB96 | FKAC98AB0E564AEB96 | 8 | fltcoor.ur.id | 11 | Using index |
| 1 | SIMPLE | ek | eq_ref | PRIMARY | PRIMARY | 8 | fltcoor.urek.eventKeyReferences_id | 1 | Using where |
+----+-------------+-------+--------+-----------------------------------------------+--------------------+---------+------------------------------------+------+-------------+
7 rows in set (0.00 sec)
出于某种原因,在 id = 1 的查询中,MYSQL 会处理大约 16.000 行。
这一直困扰着我一整天,因为我找不到为什么会发生这种情况。如果有任何更多信息,我很乐意提供,因为我自己远非 Mysql 专家。
最佳答案
正如 Jakob 所说,如果您有 160000 个用户 1 的条目,那可能是您的瓶颈。我已经重写希望能有所帮助。我更改了顺序,希望将最小的粒度部分放在查询的主要位置并从中链接起来。我怀疑给定序列号的记录很少,因此将其放入 WHERE 子句并添加次要的 JOIN 条件(通过实现的 ON/AND 子句)应该会有所帮助。
SELECT
ek.eventKey,
ek.label,
ek.dataUnit,
ed.valueParam,
eh.timestamp
FROM
Unit AS un
INNER JOIN UnitReference AS ur
ON un.id = ur.unit_id
AND ur.user_id = 3 <== ADDED USER ID CRITERIA HERE
INNER JOIN User AS u
ON ur.user_id = u.id
INNER JOIN UnitReference_EventKeyReference AS urek
ON ur.id = urek.UnitReference_id
INNER JOIN EventKeyReference AS ek
ON urek.eventKeyReferences_id = ek.id
AND ek.eventKey = 'C004' <== ADDED EVENT KEY CRITERIA HERE
INNER JOIN EventData AS ed
ON ek.eventKey = ed.keyParam
INNER JOIN EventHeader AS eh
ON ed.eventHeader_id = eh.id
WHERE
un.serialNumber=221148096
ORDER BY
eh.timestamp LIMIT 1;
如果上述方法不起作用,我会尝试的唯一其他项目,并且因为它是 MySQL,我会再添加一个关键字...
SELECT STRAIGHT_JOIN [查询的其余部分]
它告诉 MySQL 按照您指定的顺序进行查询,而不是尝试以不同的顺序为您考虑。
关于MySQL Select 不在不同的 Where 值上使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19637559/
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!