How to determine the best index on a table with 3 nullable columns? I am examining a users table similar to this: 

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `password` varchar(81) DEFAULT NULL,
  `mobile_phone_number` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;


I am not sure if I need a big index comprising the 3 primary searched and identifiers : username,email,mobile_phone_number . 
I need all of these fields to be searched as quick as possible. 
Main queries contain where conditions on either email and mobile_phone_number or username. As well as each on their own.

How can I determine the best index over these ? 

My fear of using a index over all 3 is that it would not be efficient in some of my main queries as they are all nullable columns. Is the column beeing nullable even relevant to the index use ?
When looking up contact info, an index with username, email, mobile_phone_number would be great except for three small problems


uniqueness of username
uniqueness of email
uniqueness of mobile_phone_number


If username is supposed to be unique, then username, email, mobile_phone_number would just be overkill with index bloating.

Since email and mobile_phone_number are nullable, they need unique indexes as well.

If you create a unique index on username, email or mobile_phone_number, MySQL will disallow the insert for you on any individual uniqueness.

You could still create an index username, email, mobile_phone_number as a good covering index to retrieve all three columns when looking up by username with

SELECT username, email, mobile_phone_number
FROM users WHERE username = '...';


SUGGESTION

Create the indexes to have the following

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `password` varchar(81) DEFAULT NULL,
  `mobile_phone_number` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `mobile_phone_number` (`mobile_phone_number`),
  UNIQUE KEY `contact_info_ndx` (`username`,`email`,`mobile_phone_number`)
) ENGINE=InnoDB;


by running

ALTER TABLE users
   ADD UNIQUE KEY (`username`),
   ADD UNIQUE KEY `email` (`email`),
   ADD UNIQUE KEY `mobile_phone_number` (`mobile_phone_number`),
   ADD UNIQUE KEY `contact_info_ndx` (`username`,`email`,`mobile_phone_number`)
;