【问题标题】:mysql vs sqlserver vs postgres Do they store indexes differently?mysql vs sql server vs postgres 他们存储索引的方式不同吗?
【发布时间】: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


【解决方案1】:

对于最后的查询,只需在 (facebook+youtube) 上创建一个表达式/函数索引,这将大大加快速度。 Postgresql 可以轻松做到这一点,只需使用:

CREATE INDEX foo_idx ON table(facebook+youtube)

我相信 MySQL 也可以做到这一点,在文档中搜索“虚拟列和有效功能索引”,至于 SQL Server,我不知道,但考虑到它的声誉,我希望它会......

您还可以使用覆盖索引,例如:

(youtube,facebook)
(facebook,youtube)

以及包括 facebook+youtube 总和在内的变体,但您最终会得到大量索引,从而减慢插入速度并占用大量空间,因此这是一种折衷方案。

但是,我认为您的“前 100 个”查询的结果不会每 2 秒更改一次,因此即使它们有点慢,您也可以使用 cron 每 5 分钟进行一次查询并缓存结果,因此您可以快速获得结果,而无需使用太多索引进行快速插入...

【讨论】:

    【解决方案2】:

    每个 dbms 都有不同的查询优化器。查询优化器决定何时以及如何最好地使用索引。

    在这三个——MySQL、SQL Server 和 PostgreSQL——中,MySQL 具有最不复杂的查询优化器。如果您的选择基于不代表真实世界查询的查询,您可能会对结果不满意。例如,对于 MySQL,请参见 Order By optimization

    查询性能不仅仅是 dbms 是否可以在不从表本身获取的情况下从索引中读取值的问题。这也是一个问题,例如 dbms 支持哪些类型的索引、数据库如何部署在磁盘上以及如何调整 dbms 服务器等等。例如,对于 PostgreSQL,请参见 IndexesTablespaces

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 2020-09-25
      • 2019-08-07
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      相关资源
      最近更新 更多