How to cache select with variables? (MySQL)
For efficient fetch of a random row, here is a blog on such.

Do you really select all columns of all rows, as indicated in the timings you mention?

Keep in mind that all entires for a given table in the "Query cache" are deleted whenever any write operation happens on that table.  (This makes the QC rarely of any use in busy production servers.)

A common mistake in many-to-many table is to have an AUTO_INCREMENT id.  Check out that and other many:many tips here.

VIEWs are a convenience, not a way to get efficiency.  Pretend you don't have the VIEW and write the real query you need.  If it is 'fast enough', then I have given you the answer.  If not, let's see it and look for ways to optimize it.  Please provide SHOW CREATE TABLE for each relevant table.