范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Postgres和MySQL中的索引合并与复合索引

  复合索引比索引合并要快10倍左右。在Postgres中,这个差距比MySQL大,因为Postgres对涉及索引合并的查询时,不只仅进行索引的扫描。
  那么与让数据库对多个索引进行索引合并相比,复合索引的速度有多大?考虑一下这个查询。SELECT count(*) /* matches ~100 rows out of 10M */
  FROM table
  WHERE int1000 = 1 AND int100 = 1
  /* int100 rows are 0..99 and int1000 0...9999 */查看表的定义
  我们可以在(int1000, int100)上创建一个复合索引,或者我们可以在(int1000)和(int100)上有两个单独的索引,依靠数据库来利用这两个索引。
  一个复合索引是比较快,但是比两个单独的索引快多少呢?让我们做一下理论上的计算,然后在PostgreSQL和MySQL中测试一下。Napkin Math
  Composite Index: ~1ms
  Index Merge: ~10-30ms
  Reality
  Composite Index: 5ms
  Index Merge
  MySQL: 30-40ms
  Postgres: 30-90ms
  Conclusion理论计算
  我们将从理论计算开始,然后用Postgres和MySQL来验证它。复合索引:1ms
  这个count(*)的理想索引是:
  CREATE INDEX ON table (int1000, int100)
  它允许在这一个索引上进行整个计数。
  "WHERE int1000 = 1 AND int100 = 1 " 匹配该表10M总数中的100条记录。 数据库会在索引树中快速搜索到索引中两列都是1的叶子,然后向前扫描直到条件不再成立。
  对于这些64位的索引条目,我们预计只需要扫描100个匹配的条目,这是一个可以忽略不计的2 KiB大小。根据理论上的参考资料,我们可以从内存中读取1 MiB/100 μs ,所以这绝对不需要时间。考虑到查询开销、浏览索引树和其他一切,理论上数据库不应该花费超过100-500 μs的时间来满足这个查询。索引合并:10-30ms
  但是数据库也可以对两个独立的索引进行索引合并。CREATE INDEX ON table (int1000)
  CREATE INDEX ON table (int100)
  但是,一个数据库如何利用两个索引?以及这种合并可能有多昂贵?
  索引如何相交取决于数据库!有很多方法可以找到两个无序列表的交集:散列,排序,集合,KD树,位图,...
  MySQL做的是所谓的索引合并相交,很可能是排序。Postgres通过在扫描每个索引后生成一个位图,然后把它们并在一起,来做索引交集。
  int100 = 1返回大约10M 1/1000 100,000行,这大约是1.5 MiB的扫描量。 int1000 = 1只匹配10,000行,所以我们总共从两个索引中读取大约200μs的内存。
  在我们得到索引中的匹配结果后,我们需要与它们相交。在这种情况下,为了简化计算,让我们假设对两个索引中的匹配数据进行排序,然后从那里进行交叉。
  我们可以在5 ms内对1 MiB数据 进行排序。因此,我们总共需要10毫秒来排序,在两个排序的列表中迭代200微秒的内存读取,将交集写入内存,再花200微秒,然后我们就得到了交集,即符合两个条件的行。
  因此,我们的计算表明,对于我们的两个独立索引,我们期望查询需要10毫秒。排序对索引的大小很敏感,这是相当近似的,所以给它一个低的乘数来着陆,10-30ms。
  正如我们所看到的,交叉承担着有意义的成本,在纸面上,我们期望它比复合索引大约慢一个数量级。然而,对于大多数情况来说,10ms仍然是合理的,而且根据情况,没有一个更专业的复合索引来进行查询可能是很好的。例如,如果你经常在10几列的子集之间进行连接。实际情况
  现在我们已经从第一原理上设定了对复合索引与索引合并的期望,让我们看看Postgres和MySQL在现实中的表现。复合索引:5ms
  在我们创建索引后,MySQL和Postgres都会执行只读索引的扫描。/* 10M rows total, int1000 = 1 matches ~10K, int100 matches ~100K */
  CREATE INDEX ON table (int1000, int100)
  EXPLAIN ANALYZE SELECT count(*) FROM table WHERE int1000 = 1 AND int100 = 1/* postgres, index is ~70 MiB */
  Aggregate (cost=6.53..6.54 rows=1 width=8) (actual time=0.919..0.919 rows=1 loops=1)
  -> Index Only Scan using compound_idx on test_table (cost=0.43..6.29 rows=93 width=0) (actual time=0.130..0.909 rows=109 loops=1)
  Index Cond: ((int1000 = 1) AND (int100 = 1))
  Heap Fetches: 0
  /* mysql, index is ~350 MiB */
  -> Aggregate: count(0) (cost=18.45 rows=1) (actual time=0.181..0.181 rows=1 loops=1)
  -> Covering index lookup on test_table using compound_idx (int1000=1, int100=1)
  当索引被缓存时,它们各自需要大约3-5ms。这比我们从理论计算预期的1ms要慢一些,但根据我们使用数据库经验,结果在一个数量级内,似乎可以接受。我们把这归因于查询索引的开销。索引合并
  MySQL:30-40ms
  当我们在MySQL中执行查询时,需要30-40ms,这很好地符合了我们计算的上限。这意味着我们的第一原则性理解很可能与现实相符!
  让我们通过查看查询计划来确认它正在做我们期望的事情。/* 10M rows total, int1000 = 1 matches ~10K, int100 matches ~100K */
  EXPLAIN ANALYZE SELECT count(*) FROM table WHERE int1000 = 1 AND int100 = 1
  /* mysql, each index is ~240 MiB */
  -> Aggregate: count(0) (cost=510.64 rows=1) (actual time=31.908..31.909 rows=1 loops=1)
  -> Filter: ((test_table.int100 = 1) and (test_table.int1000 = 1)) (cost=469.74 rows=409) (actual time=5.471..31.858 rows=86 loops=1)
  -> Intersect rows sorted by row ID (cost=469.74 rows=410) (actual time=5.464..31.825 rows=86 loops=1)
  -> Index range scan on test_table using int1000 over (int1000 = 1) (cost=37.05 rows=18508) (actual time=0.271..2.544 rows=9978 loops=1)
  -> Index range scan on test_table using int100 over (int100 = 1) (cost=391.79 rows=202002) (actual time=0.324..24.405 rows=99814 loops=1)
  MySQL的查询计划告诉我们,它正在做的正是我们所期望的:从每个索引中获取匹配的条目,将它们相交并在相交处进行计数。在没有分析的情况下运行EXPLAIN,我可以确认它从索引中提供了所有的东西,而且永远不会去寻找完整的行。
  Postgres:30-90ms
  Postgres也在我们计算的一个数量级内,但它在更高的范围内,有更多的变化,总的来说表现比MySQL差。它的基于位图的相交只是在这个查询上比较慢吗?还是它在做一些与MySQL完全不同的事情?
  让我们看一下使用与MySQL相同的查询计划。/* postgres, each index is ~70 MiB */
  Aggregate (cost=1625.63..1625.64 rows=1 width=8) (actual time=65.430..65.431 rows=1 loops=1)
  -> Bitmap Heap Scan on test_table (cost=1222.22..1625.38 rows=101 width=0) (actual time=63.821..65.405 rows=109 loops=1)
  Recheck Cond: ((int1000 = 1) AND (int100 = 1))
  Rows Removed by Index Recheck: 179
  Heap Blocks: exact=286
  -> BitmapAnd (cost=1222.22..1222.22 rows=101 width=0) (actual time=63.694..63.695 rows=0 loops=1)
  -> Bitmap Index Scan on int1000_idx (cost=0.00..110.98 rows=9940 width=0) (actual time=3.945..3.945 rows=10063 loops=1)
  Index Cond: (int1000 = 1)
  -> Bitmap Index Scan on int100_idx (cost=0.00..1110.94 rows=101667 width=0) (actual time=58.917..58.917 rows=100038 loops=1)
  Index Cond: (int100 = 1)
  它证实了它正在使用位图策略来交叉两个索引,但这并不是造成性能差异的原因。
  当MySQL从索引中提供整个集合(count(*))时,Postgres实际上是到堆中去获取每一条记录。堆包含了整个行,它的大小超过1KiB。这是很昂贵的,当堆缓存不热的时候,查询需要超过100ms的时间。
  从查询计划中我们可以看出,Postgres似乎无法结合索引相交来进行纯索引扫描。也许在未来的Postgres版本中,他们会支持这一点。
  当我们只为100条记录进入堆时,进入堆并没有很大的影响。然而,如果我们把条件改为WHERE int10 = 1 and int100 = 1,总共有10,000条匹配,那么这个查询在Postgres上需要7个小时,而在MySQL上则需要200ms,因为MySQL的纯索引扫描还在继续。
  因此,MySQL在索引合并上更胜一筹,因为有机会从索引中完成整个查询。
  不过,Postgres和MySQL在仅有索引的扫描上确实有大致相当的性能。例如,如果我们做int10 = 1,Postgres会做它自己的只读索引扫描,因为只涉及一个索引。
  在我第一次运行Postgres的这种纯索引扫描时,耗时超过一秒钟,我不得不运行VACUUM以使其性能相匹配。仅有索引的扫描需要经常对表进行VACUUM,以避免在Postgres中去堆中获取整个行。
  VACUUM有帮助,因为Postgres由于其MVCC的实现,必须访问堆中自上一次VACUUM后被触及的任何记录。根据我的经验,如果你有一个更新量很大的表,而VACUUM又很昂贵的话,那么在生产中,这可能会对仅有索引的扫描产生严重影响。总结
  索引合并比复合索引要慢10倍,因为临时相交不是一个非常快的操作。它需要对每个索引扫描的输出进行排序来解决。索引可以进一步优化交集,但这可能会对负载的稳定产生其他影响。
  如果你想知道是否需要添加一个复合索引,或者可以不用创建单个索引并依靠数据库使用这两个索引--那么我们建立的经验法则是,索引合并的速度将比复合索引慢10倍。然而,在大多数情况下,只要你对100多条记录进行操作(在一个关系型数据库中,希望你大多是这样),我们仍在谈论低于100ms的速度。
  当相交的列超过两列时,性能上的差距可能会略微扩大,而且表也比较大
  如果你使用的是Postgres,要小心依赖索引合并!Postgres不做索引合并。Postgres在索引合并后不做纯索引扫描,需要去堆里找可能是10万条记录的count(*)。但是如果你只返回10几到100几条记录,结果是可接受的。

请问有二十年的视同缴费年限还需要缴纳社保吗?当然是必须要缴纳社保的,而且是要缴纳企业职工基本养老保险才有退休的希望,只有20年的视同缴费年限,这是无法办理退休的。按照中华人民共和国社会保险法第十六条的规定,参加基本养老保险的100元人民币能在泰国干什么!当地导游可能会让你出乎意料随着世界各国旅游业的快速发展,这也就使得越来越多的国人们都喜欢上了出国旅游。(此处已添加小程序,请到今日头条客户端查看)对于资金充足的国人们来说,多数的他们在出国旅游的时候,也都会损阴败德的几件事1。家长里短的去讨论他人的物是人非。为了迎合他人,彰显存在感,满足虚荣心而去对一些物是人非品头论足,来争取别人的认同和集体认可。用不了多久也会成为别人的舆论谈资,试想一下在显微镜放不回来了!C罗雇搬家公司搬离曼市宾利车也被拉走北京时间11月26日消息,据太阳报报道,已经与曼联解约的C罗日前雇佣了搬家公司,让他们搬运自己在曼彻斯特的豪车行李等物品。太阳报报道称,就在曼联官宣与C罗解约之前,已经有人看到C罗小鹏汽车遭摩根大通减持11月两度抛售套现超5。7亿港元小鹏汽车视觉中国资料图澎湃新闻记者从香港交易所获悉,摩根大通(JPMorganChaseCo。)在11月22日减持小鹏汽车W(09868。HK)783。52万股,每股平均价28。1A股永顺泰的大股东是谁?业绩怎么样?永顺泰的大股东是谁?永顺泰的全称是,粤海永顺泰集团股份有限公司大股东,行业类别,食品饮料,啤酒,酒饮料和精制茶制造业。永顺泰注册(办公)地址,中国广州经济技术开发区金华西街1号注册增额终身寿险遭监管点名部分产品停售新快报讯记者林广豪报道当前,保险开门红销售正旺,但银保监会日前通报称,因行业恶性竞争现象有所抬头,部分增额终身寿险产品被停售。记者发现,有保险经纪人借机炒停售,也有人建议消费者谨慎恒大11宗地遭政府无偿收回,净面积超2000亩,公司将提出行政复议11月24日,恒大公告称,武汉市江夏区政府作出决定,无偿收回恒大武汉科技旅游城项目11宗土地,该决定书仅针对该项目的其中11宗土地,不涉及该项目的其它地块。据悉,恒大原计划将该项目加兰小莫布里的上限非常高他甚至可以比字母哥更优秀直播吧11月27日讯近日,骑士后卫加兰接受媒体采访时谈到了队友小莫布里。加兰说道埃文(莫布里)可以成为任何他想成为的人,我认为他的上限非常高,他甚至可以比字母哥更优秀。他可以做到任世界杯扫盲澳洲只有澳大利亚,是不是每届世界杯都能直接参加?今晚有人问了我这么一个问题参加世界杯是通过从全球各州比赛选出来的,那澳洲只有澳大利亚一个国家,是不是没有对手,可以直接参加世界杯?这确实比较有意思。我们知道澳洲只有澳大利亚一个国家世界杯今日赛程以及转播解说赛程(以下均为北京时间)18点日本VS哥斯达黎加21点比利时VS摩洛哥0点克罗地亚VS加拿大3点西班牙VS德国看点总结日本在战胜都过后能否再接再厉,继续赢下去。赛前接受采访的德布劳
翡翠红石滩雪域雅家埂2014最忆海螺沟(六)1hr这是2012年2月,中央电视台走近科学栏目组对海螺沟有这样一则报道在四川海螺沟,贡嘎山下一条冰川的下面,有条绵延几公里的山沟,那里的石头与众不同,在石头的表面都覆盖着一层红色八达岭长城一日游假期不得歇,儿要看饕餮,万里奔长城,电影也坑爹。去年爱奇艺上看了个电影长城,儿子陪我一起躺床上看的,都说景甜没演火,儿子却喜欢上了非人类主角饕餮,居然自己又拿平板看了三次。并且经常微游河北海报亲山亲水,来一次自然深呼吸头条带你乐享河北我是大美河北推荐官微游河北河北文旅看图识景我爱石家庄蓝天白云旅行,不必拘泥于路途的远近,正如古人所说近水遥山皆有情。近日,河北省文化和旅游厅举办了微游河北乐享身边的CBA最新消息!比斯利官宣加盟,辽宁名宿担任主教练,王庆明1换3目前CBA自由市场上是日趋活跃起来,如今已经有几名球员完成了相关的交易,像朱旭航已经加盟新疆男篮,王庆明也将奔赴广厦男篮,同时还有外援的引进以及教练人员的调整,接下来我们一起来关注历届总决赛MVP,能排辽宁队第一位,非赵继伟莫属CBA联盟从19992000年开始,设立了常规赛MVP和总决赛FMVP两项奖项,该奖项是给予常规赛和总决赛表现最佳的球员所颁发的一个荣誉奖项。20212022常规赛MVP和总决赛F解散!刘维伟30天送走8名主力,马布里离开,辽宁球星接手北控问如何每天都能收到如此有趣的体育原创资讯?答只需轻点右上角的关注按钮就能实现梦想。古人有云新官上任三把火,刘维伟的第一把火就烧得十分旺,从他被任命为青岛主教练只过了30天的时间,球游清东陵品帝王霸气之孝陵(顺治皇帝)孝陵是清世祖爱新觉罗福临(顺治皇帝)的陵寝,位于瑞山主峰南麓,背后靠昌瑞山,前朝金星山,位居陵区主轴线上。后世四座帝陵依次分列左右,深刻体会了居中为尊长幼有序尊卑有别的传统观念。孝胥山石韵胥山之石,属海中沙石,亿万年前这里是一片大海文清风胥山是嘉兴市本级唯一的一座石山,高五十米,方圆百亩。这座以伍子胥之名命名的石山,在七十年代初,因嘉兴北部河道护岸缺石,被硬生生地开挖成了一个山石坑。从此,这座市本级唯一的石山看透百亿光年洞悉星辰大海(2015年8月2日摄)FAST项目拼装第一块反射面板(2015年12月16日摄)FAST反射面板安装近半(2016年3月9日摄)FAST项目反射面板安装近八成(2016年7月3日幼儿积食案例幼儿积食,有时候很隐蔽,当时并没有什么表现,往往过段时间会出现症状。而症状的表现,开始时已经脱离积食的症状。给治疗带来障碍河南周口的幼儿,男,四岁。5月26日偶感风寒,有汗出,怕热紫云山庄的印记生活总是会这样,总有太多的不如意。使得这一路的美好总是踉踉跄跄的有些狼狈不堪。在许多无从诉说的压抑里,每一次的出行旅程都显得异常的珍贵。包括这一次与紫云山庄的亲密邂逅。路线图摩旅总