É importante notar que a ideia básica do exemplo realmente ilustra bem o que é um índice. Ele inverte o que é chave e valor em relação a tabela. A chave da tabela é identificar o único que é usado para chegar na informação que deseja, enquanto que no índice ele é o valor que é usado para referenciar onde está o objeto que realmente se quer ter acesso, a chave é a informação que está procurando.
Como bem respondido, nessa estrutura de Lua não funciona bem como um índice, porque o índice permite chaves duplicadas (ao contrário da tabela), e a estrutura de tabela de Lua não permite chaves duplicadas. E ainda potencialmente pode ter que percorrer toda estrutura para achar o que deseja, já que o hash pode ter colisões, embora na prática será muito rápido e isso
não acontecerá, então poderá ser tão ou mais rápido que uma árvore B.
Uma árvore B é mais complexa, mas dá melhores garantias, além de permitir a duplicidade. E principalmente funciona melhor para armazenamento de massa organizados em blocos de dados como é um HDD ou SSD.
Existem outras estruturas para certos tipos de índices que podem ser mais otimizadas para certa situação, por exemplo indexar um booleano onde é preferível usar um índice de bitmap. Onde a escrita é mais importante que a leitura pode ser útil um índice, ou mesmo as tabelas, organizadas em log structered merge.
SQL e índices são coisas completamente independentes.
Espero ter ajudado.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).