Você definitivamente deve gastar algum tempo lendo sobre a indexação, há muito escrito sobre isso e é importante entender o que está acontecendo.
Em termos gerais, um índice impõe uma ordem nas linhas de uma tabela.
Por uma questão de simplicidade, imagine que uma tabela seja apenas um grande arquivo CSV. Sempre que uma linha é inserida, é inserida no final . Portanto, a ordem "natural" da tabela é apenas a ordem na qual as linhas foram inseridas.
Imagine que você carregou esse arquivo CSV em um aplicativo de planilha muito rudimentar. Tudo o que essa planilha faz é exibir os dados e numerar as linhas em ordem seqüencial.
Agora imagine que você precisa encontrar todas as linhas que possuem algum valor "M" na terceira coluna. Dado o que você tem disponível, você tem apenas uma opção. Você digitaliza a tabela verificando o valor da terceira coluna para cada linha. Se você tem muitas linhas, esse método (uma "verificação de tabela") pode demorar muito tempo!
Agora imagine que, além desta tabela, você tenha um índice. Esse índice específico é o índice de valores na terceira coluna. O índice lista todos os valores da terceira coluna, em alguma ordem significativa (digamos, em ordem alfabética) e, para cada um deles, fornece uma lista de números de linhas onde esse valor aparece.
Agora você tem uma boa estratégia para encontrar todas as linhas em que o valor da terceira coluna é "M". Por exemplo, você pode executar uma pesquisa binária ! Enquanto a varredura da tabela exige que você procure N linhas (onde N é o número de linhas), a pesquisa binária exige apenas que você observe as entradas do índice log-n, no pior dos casos. Uau, isso é muito mais fácil!
Obviamente, se você possui esse índice e está adicionando linhas à tabela (no final, já que é assim que nossa tabela conceitual funciona), é necessário atualizar o índice todas as vezes. Assim, você trabalha um pouco mais enquanto escreve novas linhas, mas economiza muito tempo ao procurar algo.
Portanto, em geral, a indexação cria uma troca entre eficiência de leitura e eficiência de gravação. Sem índices, as inserções podem ser muito rápidas - o mecanismo de banco de dados apenas adiciona uma linha à tabela. À medida que você adiciona índices, o mecanismo deve atualizar cada índice enquanto executa a inserção.
Por outro lado, as leituras se tornam muito mais rápidas.
Espero que isso cubra suas duas primeiras perguntas (como outras pessoas responderam - você precisa encontrar o equilíbrio certo).
Seu terceiro cenário é um pouco mais complicado. Se você estiver usando o LIKE, os mecanismos de indexação normalmente ajudarão na sua velocidade de leitura até o primeiro "%". Em outras palavras, se você estiver SELECIONANDO A coluna WHERE LIKE 'foo% bar%', o banco de dados usará o índice para encontrar todas as linhas em que a coluna começa com "foo" e precisará verificar esse conjunto de linhas intermediárias para encontrar o subconjunto que contém "bar". SELECT ... WHERE a coluna LIKE '% bar%' não pode usar o índice. Espero que você possa ver o porquê.
Por fim, você precisa começar a pensar em índices em mais de uma coluna. O conceito é o mesmo e se comporta de maneira semelhante ao material LIKE - essencialmente, se você tiver um índice em (a, b, c), o mecanismo continuará usando o índice da esquerda para a direita da melhor maneira possível. Portanto, uma pesquisa na coluna a pode usar o índice (a, b, c), como faria em (a, b). No entanto, o mecanismo precisaria fazer uma varredura completa da tabela se você estivesse pesquisando ONDE b = 5 EC = 1)
Espero que isso ajude a esclarecer um pouco, mas devo reiterar que é melhor você passar algumas horas procurando bons artigos que explicam essas coisas em profundidade. Também é uma boa ideia ler a documentação do servidor de banco de dados específico. A maneira como os índices são implementados e usados pelos planejadores de consultas pode variar bastante.