Quand MySQL se me à déraper, c’est habituellement l’oeuvre de quelques requêtes SQL problématiques. Un petit rappel pour vous aider à trouver la/les coupables!
Note: this article was originally posted in French here.
You! Yes! Yep, you! I’m talking to you my friend! You, the one that I help out in forums, on IRC, on mailing lists!
Each and every day, I answer questions related to MySQL, mostly about SQL queries or optimization problems. Whether it’s on dBForums, Stack Overflow, MySQL.com, developpez.net or on IRC (irc.freenode.net, channel #mysql), it’s always the same thing! If you want me to help you, make it easy for me!
So, here’s a quick guide explaining what you have to do if …
[Lire plus]Oui! Toi mon ami! Oui! Toi! C’est à toi que je m’adresse! Celui que je dépanne et que j’aide « gratis » à chaque jour!
Je réponds quotidiennement à des questions au sujet de MySQL, principalement de requêtes et d’optimisation. Que ce soit sur dBForums, Stack Overflow, MySQL.com, developpez.net ou sur IRC (irc.freenode.net, channel #mysql), c’est toujours la même chose. Si tu veux que je t’aide, aide-moi à t’aider!
Donc, un petit guide de ce qu’il faut faire pour qu’on puisse résoudre ton problème le plus rapidement possible.
Explique ton problème clairement
Si tu es …
[Lire plus]Il est assez courant d’avoir besoin de stocker des adresses IP dans une base MySQL et malheureusement il n’est pas très courant que la manière de faire soit optimisée. Cet article vous propose de faire le point sur le sujet, ainsi que sur une erreur qu’on rencontre quand on fait presque bien les choses, mais pas tout à fait.
Comme il n’existe pas de type natif sous MySQL pour les adresses
IP, la première idée consiste à se servir d’une chaîne de
caractères. Une adresse IPv4 fait au maximum 15 caractères
(aaa.bbb.ccc.ddd), on peut donc prendre un champ
VARCHAR(15)
qui utilisera au maximum 16 octets par
valeur, soit 15 au maximum pour l’adresse plus 1 pour stocker la
taille. Pour l’exemple, voici une table visites suivant cette
idée :
CREATE TABLE visites (
user_id int(11) NOT NULL DEFAULT '0',
ip varchar(15) NOT NULL DEFAULT '',
…
Utiliser MySQL suppose de vivre avec certaines de ses
limitations. Voici comment se débrouiller avec l’une d’entre
elles : comment exécuter un UPDATE
ou un
DELETE
sur une table sur laquelle on exécute en même
temps un SELECT
?
Ce genre de situation peut se produire lorsqu’on souhaite mettre
à jour un champ d’une table avec des données agrégées provenant
de la même table. Pas clair ? Alors voici un exemple simple
:
CREATE TABLE items (
item_id int NOT NULL AUTO_INCREMENT,
purchase_date date DEFAULT NULL,
total int NOT NULL,
total_month int NOT NULL,
PRIMARY KEY (item_id)
);
INSERT INTO items (purchase_date,total) VALUES
('2010-12-01',10),
('2010-12-05',5),
('2010-10-10',14),
('2010-11-20',9),
('2010-10-09',3); …