Quão rápido uma única instância física do Mysql pode executar a seguinte consulta em uma tabela de 2 colunas com cerca de 100 GB?
SELECT short_url FROM long_to_short WHERE long_url = :in_long_url
Reconheço que isso ainda deixa de fora alguns aspectos importantes - índices/configurações de banco de dados, etc. Eu realmente apreciaria uma análise pelos vários sabores.
Você sabe como isso mudaria se hierarquizássemos o armazenamento (SSD + mecânica)?
Primeiro, vamos dar uma olhada no tipo de dados e no
INDEX
:long_url VARCHAR(255), INDEX(long_url, short_url)
- é improvável que seja longo o suficiente, mas 10ms HDD e 1ms SDD.long_url TEXT, INDEX long_url(100)
(ou algum outro prefixo) - 20ms e 2ms, mas depende muito de quantos long_urls compartilham os mesmos primeiros 100 caracteres.long_url
- talvez minutos no HDD ou SSDAgora vamos adicionar um hash MD5 (ou SHAnnn):
INDEX(md5, short_url)
- Semelhante ao primeiro ou segundo acima.INDEX(md5), PRIMARY KEY(short_url)
é sutilmente diferente.UNIQUE(md5), PRIMARY KEY(short_url)
adiciona mais alguns problemas.INDEX
contraUNIQUE
.UNIQUE
não é possível prefixar (a menos que você garanta que o prefixo é exclusivo)INDEX
pode levar ao retorno de várias linhas de aSELECT
para alguns dos casos acima.RAM e, portanto, a configuração de
immodb_buffer_pool_size
O hardware deste ano versus o do ano passado - atrevo-me a dizer que o hardware não melhorou 2x na última década. A mudança para SSDs é a única grande mudança.
Regras de ouro: