Mysql Slutar använda Index efter viss limit

Permalänk
Medlem

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.

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk

Det verkar vara en känd bugg med MyISAM. Jag föreslår att du använder InnoDB istället. Jag kunde inte reproducera problemet med InnoDB, men kunde göra det med MyISAM.

Permalänk
Medlem

Jo testat med InnoDB också, störe problemet varför jag använder MyISAM är just på grund av FULLTEXT indexering jag behöver.

Vet inte om det finns några workaround för att fixa fulltext indexering med InnoDB men annars får man väll försöka hitta andra lösningar.

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Testpilot

Nu löser det ju inte problemet men tänkte på en annan sak. I ditt exempel har du tre index för samma kolumn vilket är helt onödigt, primary är ett index som dessutom är unikt så de andra två indexen behövs inte.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]