Mysql Slutar använda Index efter viss limit
Hej
Har på senare tid stött på en drös MySQL problem som har tacklat mig rejält, vissa i sådan nivå att de kört ner min webbsida ner i backen av prestanda problem. Nästan på väg att lägga ner hela projektet då MySQL inte klarar av att hantera det.
I alla fall problemet är att MySQL slutar använda Index efter en vis limit, denna varierar ganska så gett stort mellan databaser. Ibland runt 100 ibland runt 20k ibland inte alls.....
ett litet snabbt test för er som vill ha en demonstration av problemet.
Först och främst har noterat problem i MySQL 5.1 ( gamla till nya versioner ) samt 5.5 senaste.
CREATE TABLE `test` (
`ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`NUM` INT(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
UNIQUE INDEX `ID` (`ID`),
INDEX `ID_2` (`ID`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=12
Lägg till hur ni nu vill fylla databasen själv som sagt va ganska så random vad ni kan lägga in. Så det är inte igentligen viktigt.
for ($i = 1; $i <= 100000; $i++) {
mysql_query("insert into test set NUM=".rand(1,99999));
}
Nu så litet snabbt test här. Nu är ju denna databas ganska så simpel i sin design så går ju inte demonstrera prestanda förlust här men det går att demonstrera indexrings problemet.
describe select * from test order by ID limit 100, 25;
KEY: Primary
describe select * from test order by ID limit 200, 25;
KEY: (Ingen) och använder filsök aka söka igenom databasen manuelt ignorerar totalt index.
Vist går det att forsa index. (går inte rekommendera, du måste forca den )
describe select * from test force key (PRIMARY) order by ID limit 200, 25;
KEY: Primary
I alla fall problemet kvarstår. och problemet uppstår även vid
describe select * from test order by ID limit 0, 250;
Key: (Ingen)
(För min server är det ju värt att notera att det tar mellan 0,001 sec för denna när den är Indexerad och 0,25 sec den INTE använder den och ännu värre hur högre limit man har.
T.ex. de databaser jag normalt kör kan ta upp till 30 minuter... Ja jag skämtar inte.
Så vad som händer här är att MySQL värkar totalt ignorera Index så länge man inte TVINGAR in den efter en viss limit, Nu är ju detta inte några problem så länge man har sådana simpla Queries som ovanför, men när queries bygger på och speciellt med kod bakom som och vissa delar är det nästan helt omöjligt att göra något åt det på grund av kodens dynamiska struktur.
Jag undrar om detta är som sagt va en MySQL Future eller någon seriös bugg som har letar sig in i hela deras Indexerings system, och funnits i flera år nu.
Har försökt googla som bara den om just det här problemet men utan resultat det med.
Skulle vara tacksam för svar om det här problemet, skulle helst vilja slippa byta Databas system.
Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.