Selectivity is the fraction of rows a condition actually eliminates. A column where nearly every value is unique (an email address, an order ID) is highly selective — an index on it eliminates almost the entire table per lookup, which is exactly the scenario indexes excel at. A column with only a handful of distinct values across a huge table (a boolean flag, a status column with three possible values) is low selectivity — an index on it alone often doesn't help much, because even after "using" the index, the engine might still need to retrieve a large fraction of the table's rows.
This is precisely why the optimizer sometimes ignores an index that exists and does a full scan instead — not because the index is broken, but because its own statistics say the condition isn't selective enough for an index seek plus a key lookup per row to beat a straightforward sequential scan. On the small tables used throughout this reference, the optimizer will almost always choose a scan regardless of what indexes exist, precisely because there's too little data for an index to pay for itself — this behavior only becomes visible on realistically large tables.