Definitivamente deberías pasar un tiempo leyendo sobre indexación, hay mucho escrito al respecto y es importante entender lo que está sucediendo.
En términos generales, un índice impone un orden en las filas de una tabla.
Por simplicidad, imagine que una tabla es solo un gran archivo CSV. Cada vez que se inserta una fila, se inserta al final . Por lo tanto, el orden "natural" de la tabla es solo el orden en que se insertaron las filas.
Imagine que tiene ese archivo CSV cargado en una aplicación de hoja de cálculo muy rudimentaria. Todo lo que hace esta hoja de cálculo es mostrar los datos y numerar las filas en orden secuencial.
Ahora imagine que necesita encontrar todas las filas que tienen algún valor "M" en la tercera columna. Dado lo que tiene disponible, solo tiene una opción. Escanea la tabla verificando el valor de la tercera columna para cada fila. Si tiene muchas filas, ¡este método (un "escaneo de tabla") puede llevar mucho tiempo!
Ahora imagine que además de esta tabla, tiene un índice. Este índice particular es el índice de valores en la tercera columna. El índice enumera todos los valores de la tercera columna, en un orden significativo (por ejemplo, alfabéticamente) y para cada uno de ellos, proporciona una lista de números de fila donde aparece ese valor.
Ahora tiene una buena estrategia para encontrar todas las filas donde el valor de la tercera columna es "M". Por ejemplo, puede realizar una búsqueda binaria ! Mientras que el escaneo de la tabla requiere que busque N filas (donde N es el número de filas), la búsqueda binaria solo requiere que observe las entradas de índice log-n, en el peor de los casos. ¡Vaya, eso es mucho más fácil!
Por supuesto, si tiene este índice y agrega filas a la tabla (al final, ya que así es como funciona nuestra tabla conceptual), debe actualizar el índice cada vez. Así que trabajas un poco más mientras escribes nuevas filas, pero ahorras un montón de tiempo cuando buscas algo.
Entonces, en general, la indexación crea una compensación entre la eficiencia de lectura y la eficiencia de escritura. Sin índices, las inserciones pueden ser muy rápidas: el motor de la base de datos simplemente agrega una fila a la tabla. A medida que agrega índices, el motor debe actualizar cada índice mientras realiza la inserción.
Por otro lado, las lecturas se vuelven mucho más rápidas.
Con suerte, eso cubre sus dos primeras preguntas (como han respondido otros, debe encontrar el equilibrio correcto).
Tu tercer escenario es un poco más complicado. Si usa LIKE, los motores de indexación generalmente lo ayudarán con su velocidad de lectura hasta el primer "%". En otras palabras, si está SELECCIONANDO DONDE la columna COMO 'foo% bar%', la base de datos usará el índice para encontrar todas las filas donde la columna comienza con "foo", y luego deberá escanear ese conjunto de filas intermedio para encontrar el subconjunto que contiene "barra". SELECCIONAR ... DONDE la columna COMO '% bar%' no puede usar el índice. Espero que puedas ver por qué.
Finalmente, debe comenzar a pensar en los índices en más de una columna. El concepto es el mismo y se comporta de manera similar al material LIKE: esencialmente, si tiene un índice en (a, b, c), el motor continuará usando el índice de izquierda a derecha lo mejor que pueda. Entonces, una búsqueda en la columna a podría usar el índice (a, b, c), como lo haría uno en (a, b). Sin embargo, el motor necesitaría hacer un escaneo completo de la tabla si estuviera buscando DONDE b = 5 AND c = 1)
Espero que esto ayude a arrojar un poco de luz, pero debo reiterar que es mejor pasar unas horas buscando buenos artículos que expliquen estas cosas en profundidad. También es una buena idea leer la documentación de su servidor de base de datos particular. La forma en que los planificadores de consultas implementan y utilizan los índices puede variar bastante.