Samtidigt som man går mot "respektabel ', 2 miljoner rader är fortfarande en relativt liten storlek för ett bord. (Och därför är en snabbare prestanda vanligtvis möjlig)
Som du fick reda på är jokertecken med gränssnitt särskilt ineffektiva och vi måste hitta en lösning för detta om det användningsfallet är vanligt för din applikation.
Det kan bara vara så att du inte har rätt uppsättning index . Innan jag fortsätter vill jag dock betona att även om index vanligtvis förbättrar DBMS-prestandan med SELECT-satser av alla slag, har det systematiskt en negativ effekt på prestandan för "CUD"-operationer (dvs med SQL CREATE/INSERT, UPDATE , DELETE verb, d.v.s. de frågor som skriver till databasen istället för att bara läsa till det). I vissa fall kan den negativa effekten av index på "skriv"-frågor vara mycket betydande.
Min anledning till att särskilt betona indexens ambivalenta natur är att det verkar som att din applikation gör en hel del datainsamling som en normal del av sin drift, och du måste se upp för eventuell försämring när INSERT-frågorna blir långsammare . Ett möjligt alternativ är att utföra datainsamlingen i en relativt liten tabell/databas, med inga eller mycket få index, och att regelbundet importera data från denna indatadatabas till en databas där själva datautvinningen sker. (När de har importerats kan raderna tas bort från "indatadatabasen", så att den är liten och snabb för dess INFOGA-funktion.)
En annan bekymmer/fråga handlar om bredden på en rad i casttabellen (antal kolumner och summan av bredderna på dessa kolumner). Dålig prestanda kan vara kopplad till det faktum att raderna är för breda, vilket resulterar i för få rader i tabellens lövnoder och därmed en djupare trädstruktur än vad som behövs.
Tillbaka till indexen...
med tanke på de få frågorna i frågan verkar det som att du skulle kunna dra nytta av ett ip + note-index (ett index som gjorts åtminstone med dessa två nycklar i denna ordning). En fullständig analys av indexsituationen, och ärligt talat en möjlig granskning av databasschemat kan inte göras här (inte tillräckligt med information för en...) men den allmänna processen för att göra det är att göra en lista över de vanligaste användningsfallen och för att se vilka databasindex som kan hjälpa till med dessa fall. Man kan få insikt i hur specifika frågor hanteras, initialt eller efter att index(er) har lagts till, med mySQL-kommandot EXPLAIN.
Normalisering ELLER demormalisering (eller faktiskt en kombination av båda!), är ofta en gångbar idé för att förbättra prestanda även under gruvdrift.