Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O MySQL select parece muito lento, mas não consegue pensar em como melhorar?


Acho que há alguns problemas com a consulta e a própria definição da tabela.
  • Table.name é uma coluna de caracteres 4K
  • A consulta está classificando por essa coluna

Você está classificando com base em uma coluna na qual está armazenando strings. Para classificar por strings, as comparações de strings devem ser realizadas. A comparação de strings tende a ser uma operação lenta e, dado o tamanho da coluna que você está usando, é muito provável que cause um impacto perceptível no desempenho.

Não temos uma indicação do conteúdo do seu name coluna e parece difícil pensar em um nome real que exija que muitos personagens.

Se essa string tiver vários dados conceitualmente diferentes, talvez a coluna deva ser dividida em várias colunas separadas, se possível, e depois normalizada conforme apropriado.

Se você puder dividir o conteúdo dessa coluna em várias menores e depois usá-las, as comparações de strings, embora ainda caras, seriam 'mais rápidas' simplesmente porque as strings que estão sendo comparadas serão significativamente mais curtas do que são agora.

Outra coisa a considerar é se você pode otimizar a pesquisa evitando comparações de strings completamente ou evitando consultas que causarão uma verificação completa da tabela, apesar do fato de você ter definido índices.

Para isso, você deve usar explain com sua consulta, para que você possa entender melhor o Plano de Execução de Consulta

Citando os documentos (minha ênfase):

Editar 1


Você esclareceu que seu name coluna é na verdade para notas do usuário. Nesse caso, acho que você deve considerar o seguinte (em além ao que já foi mencionado):
  1. Renomeie a coluna para algo que se relacione com seu conteúdo real
  2. Remover o índice da coluna
  3. Não não use essa coluna para pesquisar, classificar ou qualquer outra operação que não seja apenas selecioná-la para exibi-la (seria muito raro se precisar ser usado para qualquer outra coisa, IMHO.)
  4. Opcionalmente, considere alterar a coluna para um text digite e você não terá que se preocupar tanto com os ensaios do usuário sendo truncado sem aviso (a menos que a GUI tenha imposto o mesmo limite de comprimento de entrada para o usuário)