- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个 sql 查询:
SELECT Frage_ID
FROM Session_Fragen WHERE
(
Userantwort1 = 0
AND Userantwort2 = 0
AND Userantwort3 = 0
AND Userantwort4 = 0
AND Userantwort5 = 0
) AND Session_ID = 17898
ORDER BY Sessionfrage_ID ASC LIMIT 1;
一开始这个查询运行的很慢。我添加了索引以提高速度。最好使用我扫描过的索引。 500.000 行...使用索引后,我将行减少到大约。 550(取决于结果)但查询仍然需要超过 2 秒。运行。
我希望有人对我有任何改进的建议...
坦克很多!
SQL 解释:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Session_Fragen index Session_Fragen_big_index_2,Session_Fragen_big_inde... PRIMARY 8 NULL 535 Using where
显示索引:
Session_Fragen 0 PRIMARY 1 Sessionfrage_ID A 626229 NULL NULL BTREE
Session_Fragen 1 Frage_ID 1 Frage_ID A 3479 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 1 Userantwort1 A 2 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 2 Userantwort2 A 3 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 3 Userantwort3 A 5 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 4 Userantwort4 A 7 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index_2 5 Userantwort5 A 9 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index 1 Session_ID A 16057 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index 2 Frage_ID A 626229 NULL NULL BTREE
Session_Fragen 1 Session_Fragen_big_index 3
Sessionfrage_ID A 626229 NULL NULL BTREE
Session_Fragen 1 Userantwort1 1 Userantwort1 A 2 NULL NULL BTREE
Session_Fragen 1 Userantwort2 1 Userantwort2 A 2 NULL NULL BTREE
Session_Fragen 1 Userantwort3 1 Userantwort3 A 2 NULL NULL BTREE
Session_Fragen 1 Userantwort4 1 Userantwort4 A 2 NULL NULL BTREE
Session_Fragen 1 Userantwort5 1 Userantwort5 A 2 NULL NULL BTREE
Session_Fragen 1 Session_ID 1 Session_ID A 16057 NULL NULL BTREE
表结构:
Session_Fragen CREATE TABLE `Session_Fragen` (
`Sessionfrage_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`User_ID` int(7) NOT NULL,
`SF_Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Session_ID` int(11) NOT NULL,
`Frage_ID` int(11) NOT NULL,
`Userantwort1` tinyint(1) NOT NULL DEFAULT '0',
`Userantwort2` tinyint(1) NOT NULL DEFAULT '0',
`Userantwort3` tinyint(1) NOT NULL DEFAULT '0',
`Userantwort4` tinyint(1) NOT NULL DEFAULT '0',
`Userantwort5` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`Sessionfrage_ID`),
KEY `Frage_ID` (`Frage_ID`),
KEY `Session_Fragen_big_index_2` (`Userantwort1`,`Userantwort2`,`Userantwort3`,`Userantwort4`,`Userantwort5`),
KEY `Session_Fragen_big_index` (`Session_ID`,`Frage_ID`,`Sessionfrage_ID`),
KEY `Userantwort1` (`Userantwort1`),
KEY `Userantwort2` (`Userantwort2`),
KEY `Userantwort3` (`Userantwort3`),
KEY `Userantwort4` (`Userantwort4`),
KEY `Userantwort5` (`Userantwort5`),
KEY `Session_ID` (`Session_ID`)
) ENGINE=MyISAM AUTO_INCREMENT=862095 DEFAULT CHARSET=utf8
最佳答案
我为这个查询推荐以下索引:
ALTER TABLE Session_Fragen ADD INDEX sf_sess_fragen_id (
Session_ID,
Userantwort1,
Userantwort2,
Userantwort3,
Userantwort4,
Userantwort5,
Sessionfrage_ID,
Frage_ID
);
我的理由是:
首先添加等式谓词中引用的所有列。将 Session_ID
列放在第一位,因为它最有可能快速缩小搜索范围。
在这些列之后,添加 Sessionfrage_ID
列进行排序。一旦搜索找到符合 WHERE
子句中条件的行,这些行就会有效地按绑定(bind)顺序排列。顺序由索引的下一列决定,MySQL 的优化器将使用此顺序,而不必对匹配的行进行排序。
最后,从选择列表中添加 Frage_ID
列。这既不用于搜索也不用于排序,但将其包含在索引中会创建一个覆盖索引。
我测试了这个但是没有合理的测试数据,优化器没有自动使用这个新索引。如果我使用 index hint为了哄它使用新索引,我得到了一个更好的 EXPLAIN 报告(如果你在你的真实表上运行它,索引提示可能是不必要的)。
mysql> explain SELECT Frage_ID FROM Session_Fragen use index (sf_sess_fragen_id)
WHERE (Userantwort1 = 0 AND Userantwort2 = 0 AND Userantwort3 = 0
AND Userantwort4 = 0 AND Userantwort5 = 0 )
AND Session_ID = 17898
ORDER BY Sessionfrage_ID ASC LIMIT 1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: Session_Fragen
type: ref
possible_keys: sf_sess_fragen_id
key: sf_sess_fragen_id
key_len: 9
ref: const,const,const,const,const,const
rows: 1
Extra: Using where; Using index
关于这个 EXPLAIN 的好处:
rows
很好而且很低,因为 Session_ID
缩小了搜索范围。Using index
表示仅索引查询(即覆盖索引),这意味着查询根本不需要读取表行。type: index
(索引扫描),也没有看到Using filesort
。查看我的演示 How to Design Indexes, Really有关设计索引的更多指南。
关于mysql - 在 mysql 中使用索引不会缩短查询时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22897525/
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How do short URLs services work? 我经常看到来自 bitly.com 的缩短
if (args.join(" ").toLowerCase() === "are you" || args.join(" ").toLowerCase() === "are you doing")
学习Golang,想知道是否有更短的编写方法 if tiletype == 0 || tiletype == 2 { levelmap[pass
sum_num = 0 for human in humans: sum_num += human.limbs return sum_num 假设对象 human 具有属性 limbs ,如下
我想问一下是否有一种方法可以像在 MSSQL 中那样缩短这个条件,因为我也有类似的条件。 if(docType == "PO" || docType == "II" || docType == "IA
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我在单页上有一些 15-20 个 Highcharts (使用 slider ,每张幻灯片 1-2 个图表)、一些条形图、一些柱形图、一些饼图,具有不同的显示选项。我使用的是在我的闭包内有多种方法,其
几周前,我在下拉菜单的一些代码上得到了一些帮助,但我想知道是否可以使代码更短,因为下面显示的当前代码相当大,任何帮助都会很棒。 $(document).ready(function(){ $(
这里是新的。我只是想知道是否有可能使这个 if 语句更短且冗余更少。 if (!a && b) { if (c == d && e > 0) { return;
我有这个代码。 c = getch() if c == "r":
我有几行代码用于迭代列表中的字典,我想缩短它。它按原样完美运行,但似乎代码太多,我正在尝试了解如何在 Python 中(或一般情况下)保持代码高效。 for d in dev['devices']:
如果代码如下,如何缩短 if 语句? $a = null; $b = "foo"; if ((empty($a) && !empty($b)) || (!empty($a) && empty($b))
我需要计算应用的每日独立用户数。 我可以唯一识别用户的唯一方法是通过他们的 UUID(这是外部提供的,所以我不得不使用它)。 我知道我的每日用户数是几百万。 我想在 Redis 中使用一个 bitse
载体 a和 b可以使用 toString(width = 10) 缩短在 Base R 中导致以 .... 结尾的较短向量 但是,我想知道如何使缩短的向量以 ..., last vector elem
是否有缩短 HTML 页面的库(最好是 Python 库)?我的意思是它会生成一个可能更小的(就字符数而言,包括换行符 Silly example 可以改成: Silly example
如何缩短这段 CSS 的代码?当它在移动 View 中时,它将隐藏表格的某些列。我的表有 137 列,我只想查看 5 列。 @media only screen and (max-width: 800
我所拥有的是主目录中的文件路径,我希望将其处理为包含“~”的缩短路径。 例如,我的输入可能是:"/home/username/test"或 /home/./username/test或 /home/.
我们为文档生成一个 GUID,并且需要将该 GUID 包含在 C40 编码的条码(Type 29 2D)中,并且具有以下限制。 最长可达 25 个字符只能使用大写字母数字字符,不能使用特殊字符。 我曾
这个问题已经有答案了: Ternary operators in JavaScript without an "else" (13 个回答) 已关闭 4 年前。 我一直使用这样的三元表达式,但我不喜欢
首先,我想确保我知道这样一个事实:重新哈希是一个明智的话题。不过,我想听听您的一些意见,以及您会采取什么方法。 我正在构建一个分布式应用程序,其中节点远程创建由 UUID 标识的实体。最终,所有实体应
我是一名优秀的程序员,十分优秀!