Relationship between LoadAsync and InstantiateAsync on AssetReference?

I am trying to understand how this works better. If someone could read through my attempt to describe this and correct me where I am wrong, would be much appreciated.

So it seems I can just call InstantiateAsync and that gives me my instance just fine.

Or I can call LoadAsync, and that I assume loads in the prefab to memory, which will then reduce overhead on the Instantiate call?

So does this mean when I call InstantiateAsync, internally it first does the LoadAsync call? But it seems like just calling InstantiateAsync does not store the results of LoadAsync, as the summary says ‘Value’ willl be empty until LoadAsync is called.

How does that then work with Release? Whats the difference between ReleaseInstance and ReleaseAsset? I assume calling ReleaseInstance is to help keep track of profiling and deletes the actual instance. Then ReleaseAsset I presume keeps track of how many AssetReferences want to use that Loaded asset then if it reaches zero it releases the Loaded asset?

Also why does Addressable.InstantiateAsync run off of a key, but the AssetReference.InstantiateAsync runs off some arbitrary guid?

Unity source code is hidden to personal users, so I can only talk based on my personal understanding. Here’s my thoughts on some concepts:

Our assets are stored in disk, but they cannot be stored in the same format as they are in memory. They are transformed into another format suitable for persistent storage, which is called Serialization. The opposite operation is called Deserialization.

When we LoadAsync the asset is deserialized from storage and loaded into memory. However, it will not be present in our Scene. Unity runs on the basic concept of Scene. Virtually everything interactable when playing the game should be in a scene. As mentioned above, LoadAsync just put the asset into memory, but has not linked it to an active scene. You can consider them to be living in heaven: they exist, just not in our world.

Instantiate creates a clone in a scene. Often, we don’t specify that scene at all, because it defaults to the current scene. We have to instantiate the object if we want to bring it into world. Note that some utility assets can be used outside a scene if you don’t need the full feature of a scene (finding other objects, for example).