{"type":"excalidraw","version":2,"source":"https://AwesomeSystemDesign.dev","elements":[{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-1"}],"updated":0,"link":null,"locked":false,"id":"shape-0","type":"rectangle","seed":41,"x":16,"y":16,"width":288,"height":68,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-1","type":"text","seed":114,"x":36,"y":35.7,"width":248,"height":28.6,"fontSize":22,"fontFamily":1,"text":"Column | Type | Notes","originalText":"Column | Type | Notes","textAlign":"left","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-3"}],"updated":0,"link":null,"locked":false,"id":"shape-2","type":"rectangle","seed":187,"x":16,"y":128,"width":288,"height":264.8,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-3","type":"text","seed":260,"x":36,"y":146,"width":248,"height":228.8,"fontSize":22,"fontFamily":1,"text":"follower_id | BIGINT\n| Who follows\nfollowee_id |\nBIGINT | Who is\nbeing followed\ncreated_at |\nDATETIME | When\nfollowed","originalText":"follower_id | BIGINT\n| Who follows\nfollowee_id |\nBIGINT | Who is\nbeing followed\ncreated_at |\nDATETIME | When\nfollowed","textAlign":"left","verticalAlign":"middle","containerId":"shape-2","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#a68a53","backgroundColor":"#fff7e6","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-5"}],"updated":0,"link":null,"locked":false,"id":"shape-4","type":"rectangle","seed":333,"x":16,"y":436.8,"width":288,"height":1265.8,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-5","type":"text","seed":406,"x":36,"y":454.8,"width":248,"height":1229.8,"fontSize":22,"fontFamily":1,"text":"follows table\n\nPrimary key:\n(follower_id,\nfollowee_id)\nIndex: (followee_id,\nfollower_id) for \"who\nfollows me\"\n\nQueries:\n- \"Who does User B\nfollow?\"\nSELECT followee_id\nFROM follows WHERE\nfollower_id = B\n\n- \"Who follows User\nA?\" (for fanout)\nSELECT follower_id\nFROM follows WHERE\nfollowee_id = A\n\nScale: 500M users x\n200 avg follows =\n100B rows\nSharding: by\nfollower_id (for \"my\nfollowing list\" queries)\nSeparate reverse\nindex sharded by\nfollowee_id\n\nInstagram uses TAO\n(Facebook's social\ngraph cache):\n- In-memory graph\ncache on top of\nMySQL\n- Read-through cache\nwith write-through\ninvalidation\n- 99.8% cache hit\nrate","originalText":"follows table\n\nPrimary key:\n(follower_id,\nfollowee_id)\nIndex: (followee_id,\nfollower_id) for \"who\nfollows me\"\n\nQueries:\n- \"Who does User B\nfollow?\"\nSELECT followee_id\nFROM follows WHERE\nfollower_id = B\n\n- \"Who follows User\nA?\" (for fanout)\nSELECT follower_id\nFROM follows WHERE\nfollowee_id = A\n\nScale: 500M users x\n200 avg follows =\n100B rows\nSharding: by\nfollower_id (for \"my\nfollowing list\" queries)\nSeparate reverse\nindex sharded by\nfollowee_id\n\nInstagram uses TAO\n(Facebook's social\ngraph cache):\n- In-memory graph\ncache on top of\nMySQL\n- Read-through cache\nwith write-through\ninvalidation\n- 99.8% cache hit\nrate","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}