新手问答 eos mongodb 如何做查询优化

Surou · September 05, 2018 · Last by Surou replied at September 05, 2018 · 16070 hits

@strahe 我按https://www.bcskill.com/index.php/archives/432.html做了分片 但是在执行下面,查询“二级”数据时

db.action_traces.find({"act" : { "account" : "eosio" }}).limit(1)

会卡住 猜测是

指定数据库里需要分片的集合和片键,哈希id 分片
db.runCommand( { shardcollection : "eos.blocks",key : {"_id": "hashed"} } );

这个设置不对,能帮忙看下不☺

共收到 10 条回复

你将blocks 根据 _id 进行hash分片, 但是你查询的是 action_traces 啊.

act.account 可能也需要索引.

2Floor has deleted
strahe 回复
mongos> db.blocks.find().limit(1)
{ "_id" : ObjectId("5b874835fe308eca83f18fc9"), "block_id" : "0000000267f3e2284b482f3afc2e724be1d6cbc1804532ec62d4e7af47c30693", "block" : { "timestamp" : "2018-06-09T11:56:30.000", "producer" : "eosio", "confirmed" : 0, "previous" : "00000001405147477ab2f5f51cda427b638191c66d2c59aa392d5c2c98076cb0", "transaction_mroot" : "0000000000000000000000000000000000000000000000000000000000000000", "action_mroot" : "e0244db4c02d68ae64dec160310e247bb04e5cb599afb7c14710fbf3f4576c0e", "schedule_version" : 0, "new_producers" : null, "header_extensions" : [ ], "producer_signature" : "SIG_K1_KhKRMeFHa59AzBaqNvq89Mye9uTNsRsY4koYZk4GBxb4UfSEakj4LwxxP5xQVK4q9N32JFhMpjnHa8pgTKNLwP1vXpU6eg", "transactions" : [ ], "block_extensions" : [ ] }, "block_num" : 2, "createdAt" : ISODate("2018-08-30T01:28:22.280Z"), "in_current_chain" : true, "irreversible" : true, "updatedAt" : ISODate("2018-08-30T01:28:21.260Z"), "validated" : true }
mongos> db.blocks.find({"block" : {"producer" : "eosio"}}).limit(1)

查询这个也是卡住了

Surou 回复

索引,索引,索引 'block.producer'

但是我建议优化下结构, 他默认给出的结构并不适合存mongo

strahe 回复

😅 基本没用过几次mongo,临时抱佛脚, 能否有时间 专门开个帖子,说下EOS block数据 入库mongo 优化查询这块 ☺

Surou 回复

你到这一步了说明也差不多了, 其实关键是分片的片键选择和mongo的存储结构, 最好是将索引的字段移到最外层来, 比如人为的将producer移到外层, 这样就不用索引block.producer, 直接索引'producer', 查询起来方便很多.

strahe 回复
比如人为的将producer移到外层, 这样就不用索引block.producer

这个得稍微改下 mongo_db_plugin吧,数据库 跑的太艰辛,先不管这个了。

先想只解决查询卡的事,

关键是分片的片键选择

😢 按EOS 原版 mongo_db_plugin 入库的数据,怎么选呢?

索引,索引,索引 'block.producer'

这个我没看懂 😢

mongo.find({'a': 'a'}) 这样查的话把a设置为索引.

mongo.find({'a': {'b': 'c'}}) 这样查的话把a.b设置为索引.

strahe 回复

😢 如果要都能查询的话,每一级都得选一个字段做索引么,你们那边都是选的哪些 分片Key 啊

Surou 回复

不是每一级选择一个键分片, 是你检索的什么字段就要索引什么字段,

我们根据zone分片的, 不是hash分片, trans和block根据block_bum分, actions根据expiration.

大致思路: https://docs.mongodb.com/manual/tutorial/sharding-tiered-hardware-for-varying-slas/

strahe 回复

👍 我先学下

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up