mysql vs sqlserver vs postgres它们存储索引的方式不同吗?

mysql vs sqlserver vs postgres它们存储索引的方式不同吗?,mysql,sql-server,postgresql,Mysql,Sql Server,Postgresql,我目前正在为一个特殊用例对三个数据库进行基准测试 tabledata 10000000行 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 y

我目前正在为一个特殊用例对三个数据库进行基准测试

tabledata 10000000行

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结果ms:


如您所见,mysql在返回数据时速度非常快,facebook和youtube的部分现有索引都被索引。但是,当使用更复杂的查询时,db计时排名会发生逆转,这些查询的顺序不是直接索引的,例如两列的总和。我记得有些数据库直接将数据存储在索引中,而另一些数据库使用指向实际数据的指针。可能是这种情况

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

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


查询性能不仅仅是dbms是否可以从索引中读取值而不必从表本身获取值的问题。这也是一个dbms支持什么类型的索引、数据库如何部署在磁盘上以及dbms服务器如何调优等问题。例如,有关PostgreSQL,请参见和

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

CREATE INDEX foo_idx ON table(facebook+youtube)
我相信MySQL也能做到这一点,在文档中搜索虚拟列和有效的功能索引,至于SQL Server,我不知道,但考虑到它的声誉,我希望它能做到

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

(youtube,facebook)
(facebook,youtube)
还有一些变体,包括facebook+youtube sum,但最终会有大量的索引减慢插入速度并占用大量空间,因此这是一个折衷方案


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

这可能会有所不同,具体取决于当前内存中的内容&计算机正在做什么我不知道mysql和postgres,但是在sql server中,您需要的是覆盖索引,而不是每个列上的索引。数据库有各种不同的优化技术,一种方法不可能适用于所有列。您的索引是什么?所以根本没有覆盖索引?您的查询几乎返回整个表,而不仅仅是一些行?祝贺您:SQL Server根本没有使用您的索引。顺便说一下,你可以在执行计划中看到这一点