Door
- SanThe -
op 13-12-2013 16:26
gewijzigd op 13-12-2013 16:44
1.342 views
Hallo PhpHulpers,
Is deze regel correct?
ALTER TABLE logdata ADD FOREIGN KEY ( user_id ) REFERENCES logdatabase.users (id) ON DELETE CASCADE ON UPDATE CASCADE
Het probleem is dat als er meerdere records, zeg 10 tot 20, in de tabellen zitten mysql meer dan 80% cpu gaat gebruiken. Dit loopt zelfs bij nog een paar records meer op tot 99%. Oftewel niet vooruit te branden. Ik heb nu deze regel verwijderd en geen enkel probleem met cpu gebruik 0.01%.
Wie weet wat hier het probleem kan zijn?
Aanvulling:
De tabel logdata bevat o.a.:
id int(11) NOT NULL auto_increment,
user_id int(11) NOT NULL default '0',
PRIMARY KEY (id),
KEY user_id (user_id)
En de tabel users bevat o.a.:
id int(11) NOT NULL auto_increment,
PRIMARY KEY (id)
Bij mij gaan er geen alarm bellen rinkelen bij het zien van die regel.
Al heb ik liever ON UPDATE RESTRICT, id's horen niet te veranderen.
Wat voor columns zijn het? Zijn er indices op die columns?
Wanneer treed het probleem op? Tijdens het uitvoeren? Tijdens het inserten? Tijdens het verwijderen van de user? Tijdens het updaten van een user's id?
De id's zullen nooit veranderen.
Er kan een delete zijn. Echter dat is nog niet eens gebeurt.
Het probleem treedt al op bij een gewone select. Dus eigenlijk bij elke database handeling.
Toevoeging op 13/12/2013 16:59:54:
Ik heb de bewuste regel nu verwijderd en alles werkt gewoon.
Misschien heb ik die hele regel niet eens nodig.
Het enige is dat er dan misschien enkele nutteloze records blijven staan in de database.
Je bent niet geheel duidelijk in welke context dit optreed. Nogmaals, een fk op een tabel zou geen enkele (negatieve) invloed mogen hebben op de uitvoering van een select query.
Welke databaseserver gebruik je en welke tabeltypen?
Ik heb een donkerbruin vermoeden dat je dubbele AUTO_INCREMENT op twee InnoDB-tabellen ergens in de weg zit. Dat zou je moeten merken bij een UPDATE, maar maar niet bij een SELECT — tenzij je een geaggregeerde functie gebruikt, bijvoorbeeld MAX() voor de laatste log.
Ik gebruik mysql 5.1.68 met innodb.
Er zijn geen meerdere auto_increment's op de tabellen.
Elke tabel heeft alleen het id met auto_increment.
Verder niks bijzonders aan het doen.