【发布时间】:2018-03-04 00:25:39
【问题描述】:
我目前正在针对特殊用例对三个数据库进行基准测试。
表格数据(10,000,000 行)
id, facebook[random int 0-1,000,000], youtube[random int 0-1,000,000]
1, 322342, 293492
2, ...
6 个查询:
SELECT youtube, facebook FROM file_results WHERE youtube > 500000 AND facebook > 500000 ORDER BY youtube DESC LIMIT 100
SELECT youtube, facebook, youtube+facebook as total FROM file_results WHERE facebook+youtube > 1000000 ORDER BY youtube DESC LIMIT 100
SELECT youtube, facebook, youtube+facebook as total FROM file_results WHERE facebook > 500000 AND youtube > 500000 ORDER BY facebook+youtube DESC LIMIT 100
SELECT youtube, facebook, youtube+facebook as total FROM file_results WHERE facebook > 900000 AND youtube > 900000 ORDER BY facebook+youtube DESC LIMIT 100
SELECT youtube, facebook, youtube+facebook as total FROM file_results WHERE facebook+youtube > 1000000 ORDER BY facebook+youtube DESC LIMIT 100
SELECT youtube, facebook, youtube+facebook as total FROM file_results WHERE facebook+youtube > 1800000 ORDER BY facebook+youtube DESC LIMIT 100
6 个结果(毫秒):
如您所见,mysql 在返回现有索引的一部分(facebook 和 youtube 都被索引)的数据时非常快。然而,当更复杂的查询被非直接索引的东西(例如两列的总和)使用时,数据库时序排名会反转。我想我记得有些数据库直接将数据存储在索引中,而另一些则使用指向实际数据的指针。可能是这种情况
【问题讨论】:
-
这可能会有所不同,具体取决于当前内存中的内容以及机器正在执行的操作
-
我不知道 mysql 和 postgres,但是在 sql-server 中你需要覆盖索引而不是每列上的索引
-
数据库有不同的优化技术,一种方法并不适用于所有人。
-
你的索引是什么???
-
那么根本就没有覆盖索引吗?您的查询几乎返回整个表,而不仅仅是一些行?恭喜:SQL Server 根本没有使用您的索引。 (顺便说一下,您可以在执行计划中看到这一点)
标签: mysql sql-server postgresql