<p>I`ve read that columns that are chosen for indices should discriminate well among the rows, i.e. index columns should not contain a large number of rows with the same value. This would suggest that booleans or an enum such as gender would be a bad choice for an index. </p>

<p>But say I want to find users by gender and in my particular database, only 2% of the users are female, then in that case it seems like the gender column would be a useful index when getting the female users, but not when getting all the male users.</p>

<p>So would it generally be a good idea to put an index on such a column?</p>

This is a case where I would let the server statistics inform me of when to create the index.  Unless you know that this query is going to predominate or that running such a query would not meet your performance goals a priori, then creating the index prematurely may just cost you performance rather than increase it.  Also, you may want to think about how you would actually use the query.  In this case, my guess would be that you'd typically be doing some sort of aggregation based on this column rather than simply selecting the users who meet the criteria.  In that event, you'll be doing the table scan anyway and the index won't buy you anything.