LEFT JOIN performance for WHERE on secondary table
Remember how SQL works: construct a set of tuples (rows) based on the given tables and joins, then filter those based on any where clause.
Because you have a where condition on the "right" table, your outer join is effectively converted into an inner join.  

To retain the "outer-ness" of the join, put the filter condition into the join construct, rather than in the where clause: 

select * 
from      user u 
left join gender g 
     on  u.genderId = g.id 
     and g.show = 1 
[where ...]