se i dati inseriti saranno sempre 20 caratteri, perché non considerare l'utilizzo di char(20) . l'utilizzo di varchar(20) utilizzerà 20 byte per la memorizzazione dei caratteri e 1 byte per la memorizzazione della lunghezza. quindi se ci sono 1 milione di record, 1 milione di byte sarà sprecato.
per quanto riguarda la velocità tra varchar(20) e varchar(255), non penso che potrebbe essere molto difficile sceglierne uno, entrambi utilizzeranno 21 byte, non vedo alcun beneficio o perdita di prestazioni significativa dell'uno sull'altro.