sql >> Databáze >  >> RDS >> Mysql

Optimalizace dotazu MySQL LIKE term% ORDER BY int

Položili jste další otázku „Vytvoření indexu, který je nejlepší pro vyhledávání pomocí zástupných znaků prostřednictvím 40 milionů jmen“. Dobře, máte 40 milionů záznamů.

Nyní zvažte následující vzorec:

x = COUNT(DISTINCT values in a column) / COUNT(values in a column)

Index na sloupci je mnohem lepší, čím blíže x je na 1. Pokud je 1, všechny hodnoty jsou odlišné, neexistují žádné duplikáty a index je proto poměrně rychlý.

Nyní hledáte 'john%'. To jsou 4 písmena a otevřený konec. Která písmena nejsou důležitá, vaše DB se musí vypořádat s 26*26*26*26=456976 odlišnými hodnotami. Dejte to do výše uvedeného vzorce a svých 40 milionů záznamů. Získáte x z 0,0114244.

Zase nevím, co je to práh, ale IIRC je 0,1 nebo tak něco. Pokud jste tedy x je nad 0,1, použije se index, pokud je nižší, není.

Proč je to tak? Použití indexu může věci dokonce zpomalit, protože vaše databáze se musí podívat na index, vidět v tomto indexu, na které pozici na vašem fyzickém pevném disku je příslušný záznam, a pak tento záznam získat. Proto, když je x pod 10 %, je rychlejší provést skenování celé tabulky.

Abychom to shrnuli:Filtrovat 40 milionů záznamů pouze jedním slabým indexem, jako je ten váš, je prostě k ničemu.



  1. Vysvětlení MySqlBulkLoader

  2. Porovnání seznamu hodnot s tabulkou

  3. Integrace PostgreSQL s autentizačními systémy

  4. SQL pro kopírování hodnot z jedné tabulky do druhé