Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Bases de données > MySQL > Contribuez

Réponse
 
Outils de la discussion
Vieux 05/11/2006, 18h38   #16 (permalink)
Rédacteur
 
Avatar de goldkey
 
Date d'inscription: mars 2003
Messages: 793
Par défaut

J'ai été récemment confronté au douleureux probleme de perte du mot de passe ROOT !!

Voici le moyen de changer un mot de passe ROOT perdu:

Citation:
# Arrêter le serveur MySQL en tapant :
/etc/rc.d/init.d/mysql stop

# Redémarrer le server avec les options ci-dessous:
/usr/bin/safe_mysqld —skip-grant-tables —skip-networking &

# Ce connecter au serveur mysql avec :
mysql mysql

# Taper la ligne suivante (ou ’nouveau_mot_passe’ est le nouveau mot de passe) :
UPDATE user SET password=PASSWORD(’nouveau_mot_passe’) WHERE User="root" AND Host="localhost" ;

# Eteindre le serveur MySQL
mysqladmin shutdown

# Redémarrer le serveur correctement avec :
/etc/rc.d/init.d/mysql start
goldkey est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/12/2006, 10h07   #17 (permalink)
Rédacteur
 
Avatar de berceker united
 
Date d'inscription: février 2005
Localisation: Paris
Messages: 1 974
Par défaut Comment optimiser une requête utilisant le limit

L'utilisation d'un limit sur une ou des tables ayant beaucoup d'enregistrements peut énormement plomber le serveur. Surtout si vous retourner des gros contenu avec beaucoup sur des petites intervale de page. Par exemple un forum qui retourne 30 enregistrements et le pire c'est l'ajout de l'ORDER BY qui ici achève le CPU mais qui est quasi obligatoire.

Pour optimiser les performances il faut deux requêtes.
La première requête utilise le LIMIT mais ne retourne que les index.
Code :
SELECT idtopic FROM forum ORDER BY date LIMIT 100,130;
De là, nous avons une suite d'index dans l'ordre.
Dans la second requête vous utilisez la fonction IN(...). IN permet d'insérer un suite de valeur que vous souhaiter retourner.
Code :
SELECT * FROM forum WHERE idtopic IN(100,101,102,103,...);
Sur des gros enregistrements vous sentirez la différence. J'en suis arrivé en faisant des test de volume. Arrivé à 100 000 enregistrements ça rame énormement avec le LIMIT intervale 30 + ORDER BY + champs TEXT et autres. Le temps d'affichage n'est pas acceptable pour le web. Venice 3200+ 1Go Mysql5 XP.

Avec cette méthode c'est totalement liquide.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/12/2006, 22h35   #18 (permalink)
Rédacteur/Modérateur
 
Avatar de Alexandre T
 
Date d'inscription: mai 2002
Localisation: Nancy
Âge: 32
Messages: 964
Par défaut

Excellente méthode berceker united !

Je viens de tester sur une base de données médiocrement modélisée et cela me donne de bons résultats. Par contre, sur une base correctement modélisé (taille d'enregistrement fixe, index ordonné), le gain est nul.

Néanmoins, je changerais les valeurs de votre second exemple. Certains débutants pourrait faussement comprendre qu'il faut remplacer
Code :
 SELECT *  FROM forum LIMIT 100,30
par

Code :
 SELECT * FROM forum WHERE id_topic IN (100, 101, 102, 103...., 128, 129, 130)

Donc je conseillerais ces exemples :

Code :
SELECT idtopic  FROM forum LIMIT 100,30
Code :
SELECT * FROM forum WHERE idtopic IN(100,106,108,110,...,166,170);
en précisant que la première requête à retourner 100,106,108,110,...,166,170
__________________
Alexandre T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/12/2006, 22h48   #19 (permalink)
Rédacteur/Modérateur
 
Avatar de Alexandre T
 
Date d'inscription: mai 2002
Localisation: Nancy
Âge: 32
Messages: 964
Par défaut

big_ben3333, je ne pense pas que votre solution soit apportée à la FAQ. En effet, elle résulte plus à mon sens d'une réflexion pour contourner des problèmes créés par une base très mal modélisé.

Il existe des bases mal modélisé, et certaines astuces sont utiles, mais votre cas est assez particulier. De plus on peut planter votre méthode dans le cas d'utilisateurs réalisant des opérations simultanément ce qui est fréquent sur le web !

Exemple

Code :
12h00m44secondes 034ms - utilisateur 1 insère le livre 1
12h10m44secondes 080ms - utilisateur 1 insère le livre 2
12h15m14secondes 034ms - utilisateur 2 insère le livre 3
12h15m44secondes 041ms - utilisateur 1 insère le livre 4
45 millisecondes après l'insertion du livre 2 vous exécuter votre méthode pour récupérer la valeur du livre 3.
Si l'utilisateur 1 à inséré son livre 4 pendant cet intervalle de 45 millisecondes, votre algorithme retourne 4 et non 3 !
Et la méthode avec LAST_INSERT_ID, elle, permet d'éviter les accès concurrents.

Néanmoins, je vous remercie de votre aide et n'hésitez SURTOUT pas à nous conseiller d'autres questions-réponses
__________________
Alexandre T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/12/2006, 09h45   #20 (permalink)
Rédacteur
 
Avatar de berceker united
 
Date d'inscription: février 2005
Localisation: Paris
Messages: 1 974
Par défaut

Citation:
Envoyé par Alexandre T
Excellente méthode berceker united !

Je viens de tester sur une base de données médiocrement modélisée et cela me donne de bons résultats. Par contre, sur une base correctement modélisé (taille d'enregistrement fixe, index ordonné), le gain est nul.

Néanmoins, je changerais les valeurs de votre second exemple. Certains débutants pourrait faussement comprendre qu'il faut remplacer
Code :
 SELECT *  FROM forum LIMIT 100,30
par

Code :
 SELECT * FROM forum WHERE id_topic IN (100, 101, 102, 103...., 128, 129, 130)

Donc je conseillerais ces exemples :

Code :
SELECT idtopic  FROM forum LIMIT 100,30
Code :
SELECT * FROM forum WHERE idtopic IN(100,106,108,110,...,166,170);
en précisant que la première requête à retourner 100,106,108,110,...,166,170
Oui je comprend que cela puisse préter à confusion avec "idtopic". J'ai fais des test sur une table ayant plus de 100 000 enregistrements avec des champs TEXT de gros volume, j'ai constaté qu'il y a un gain. Sur un autre forum j'ai vu que c'étais une méthode à conseiller sur les forum.
Il faut pas utiliser cette methode à toute les sauces.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/06/2007, 16h50   #21 (permalink)
Membre éprouvé
 
Avatar de Joe Le Mort
 
Date d'inscription: avril 2006
Localisation: Lyon
Âge: 27
Messages: 400
Envoyer un message via MSN à Joe Le Mort
Par défaut

Je propose quelque chose pour la communauté :

La liste des pays francais/anglais avec les codes avec insertion dans MYSQL.

Télécharger le fichier, plus d'infos sur le site
__________________
Tuxboard Blog d'actu Buzz...
Video de sport
Joe Le Mort est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/08/2007, 18h53   #22 (permalink)
Rédacteur
 
Avatar de berceker united
 
Date d'inscription: février 2005
Localisation: Paris
Messages: 1 974
Par défaut

Voici une fonction qui permet de mettre le premier caractère en majuscule. Mysql5

Code :
 
CREATE FUNCTION `ucfirst`(p_str VARCHAR(255))
    RETURNS varchar(255)
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
     DECLARE strOut VARCHAR(255);
     SET strOut = TRIM(p_str);
     SET strOut = CONCAT(UPPER(LEFT(strOut,1)), RIGHT(strOut,CHARACTER_LENGTH(strOut)-1));
     RETURN strOut;
END;
 
N'étant pas satisfait du uuid() mysql pour une raison particulière je m'en suis fait une.

Code :
 
CREATE FUNCTION `UUIDII`()
    RETURNS char(36)
    DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
     DECLARE hashe1 VARCHAR(8);
     DECLARE hashe2 CHAR(4);
     DECLARE hashe3 CHAR(4);
     DECLARE hashe4 CHAR(4);
     DECLARE hashe5 CHAR(12);
     DECLARE hasheRef CHAR(36);
 
     SET hashe1 = SUBSTRING(MD5(RAND()),25);
     SET hashe2 = SUBSTRING(MD5(RAND()),29);
     SET hashe3 = SUBSTRING(MD5(RAND()),29);
     SET hashe4 = SUBSTRING(MD5(RAND()),29);
     SET hashe5 = SUBSTRING(MD5(RAND()),21);
     SET hasheRef = CONCAT_WS('-', hashe1, hashe2, hashe3, hashe4, hashe5);
     RETURN hasheRef;
END;
 
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

Dernière modification par berceker united ; 07/09/2007 à 23h53 Motif: Remplacement de LENGTH et par CHARACTER_LENGTH
berceker united est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/08/2007, 09h47   #23 (permalink)
Rédacteur/Modérateur
 
Avatar de Alexandre T
 
Date d'inscription: mai 2002
Localisation: Nancy
Âge: 32
Messages: 964
Par défaut

Citation:
Envoyé par Joe Le Mort Voir le message
Je propose quelque chose pour la communauté :

La liste des pays francais/anglais avec les codes avec insertion dans MYSQL.

Télécharger le fichier, plus d'infos sur le site
Il existe une norme (déclinée) pour cela : ISO 3611. Je pense qu'un lien vers cette norme est préférable, car constamment à jour.
__________________
Alexandre T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/08/2007, 09h48   #24 (permalink)
Rédacteur/Modérateur
 
Avatar de Alexandre T
 
Date d'inscription: mai 2002
Localisation: Nancy
Âge: 32
Messages: 964
Par défaut

Citation:
Envoyé par berceker united Voir le message
N'étant pas satisfait du uuid() mysql pour une raison particulière je m'en suis fait une.
Merci

Juste une question : Quelle est cette raison ? On pourrait peut-être la commenter ainsi.
__________________
Alexandre T.

PHP5/MySQL5 Codes prêts à l'emploi
30 projets avec codes sources complets pour créer diaporamas photos, chat, arbre généalogique, statistiques de visites, création de graphiques, moteur de recherche, Sudoku etc...

Mes articles
Alexandre T est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/08/2007, 17h22   #25 (permalink)
Rédacteur
 
Avatar de berceker united
 
Date d'inscription: février 2005
Localisation: Paris
Messages: 1 974
Par défaut

Citation:
Envoyé par Alexandre T Voir le message
Merci

Juste une question : Quelle est cette raison ? On pourrait peut-être la commenter ainsi.
En fait, je me suis intéressé à ça pour pa passer les identifiant d'enregistrement en paramètre. productid=12. 12 qui correspond un l'id d'un enregistrement dans une table. Pour un produit pas de probleme si c'est à 12 mais un concurrent voi 12785. Surtout qu'il peut savoir que les données sont autoincrémenté. En terme de sécurité c'est un peut risqué de mettre des données sensible.
le UUID peut fausser l'information et ne montre aucune hiérarchie ni un sens logic à un paramètre. Apparement il se base sur des identifiant reseau. Ce qui affiche un peut pret toujours les mêmes données (12 premiers caractères) mais sans qu'elle puisse être identique. Je voulais rendre l'information plus flou. J'ai donc fait un UUID() à ma sauce.

J'ai une table qui possède tous les id utilisés afin qu'il ne puisse en créer un indentique. Toute les tables qui doivent communiquer avec l'extérieur doivent passer par cette table "Table InOut".
Pour des raisons de développment et de maintenance chaque enregistrement de cette table (InOut) possède le nom de la table et id qui l'utilise. Ainsi je peux savoir qui utilise cette uuid.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 31/08/2007, 12h00   #26 (permalink)
Membre émérite
 
Date d'inscription: janvier 2006
Messages: 727
Par défaut

Petite proposition : comment désactiver la commande (destructrice) DROP DATABASE avec PhpMyAdmin :
http://www.developpez.net/forums/sho...d.php?t=403838
guidav est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/09/2007, 22h41   #27 (permalink)
Rédacteur
 
Avatar de berceker united
 
Date d'inscription: février 2005
Localisation: Paris
Messages: 1 974
Par défaut

Voici une fonction permettant de faire une split d'une chaine. Celui-ci retourne un tableau. En fait, ce n'est pas une fonction mais une procédure stocké. La raison est qu'une fonction n'accepte pas des chaines de caractère avec des accents.

Code :
 
CREATE PROCEDURE `Split`(IN p_str TEXT, IN p_delimiter CHAR(1))
    DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY INVOKER
    COMMENT ''
BEGIN
     DECLARE Pos INTEGER(11);
     DECLARE sub_Str TEXT;
     
     SET Pos     = 1;
     SET sub_Str = '';
 
     BEGIN
          CREATE TEMPORARY TABLE IF NOT EXISTS t_split(
                 `idItem` INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT,
                 `Item` TEXT,
                 PRIMARY KEY  (`idItem`)
          ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT = 'Tempory table';
     END;
 
     TRUNCATE t_split;
 
     COMMIT;
     
     WHILE Pos <= LENGTH(p_str) DO
           BEGIN
                IF SUBSTRING(p_str, Pos, 1) <> p_delimiter THEN
				   SET sub_Str = CONCAT(sub_Str, SUBSTRING(p_str, Pos, 1));
		        ELSE
					INSERT INTO t_split (Item) VALUES(sub_Str);
					SET sub_Str = '';		
                END IF;
                
                IF LENGTH(p_str) = Pos THEN
                   INSERT INTO t_split (Item) VALUES(sub_Str);
                END IF;
                
                SET Pos = (Pos + 1);
           END;
     END WHILE;
     SELECT * FROM t_split;
END;
 
CALL Split('titi|tata|tutu','|');
SELECT * FROM t_split;
 
La procédure stocké va envoyé le resultat dans une table temporaire nommé t_split.
Si vous executez la procédure il vous retourne une table avec deux champs IdItem et Item.
De là, vous pouvez encore récupérer le resultat en faisant select * from t_split pour travailler dessus.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/11/2007, 14h47   #28 (permalink)
Futur Membre du Club
 
Date d'inscription: mars 2002
Messages: 39
Par défaut

Citation:
Envoyé par le lynx Voir le message

J'y voit pas la réponse à mon problème: comment interfacer une appli ASP.NET avec MySQL, quel driver utiliser?
Une info qui pourrait intéresser pas mal de gens!

Philippe
ODBC et le driver fournit par mysql non
Michel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/11/2007, 15h02   #29 (permalink)
Rédacteur
 
Avatar de berceker united
 
Date d'inscription: février 2005
Localisation: Paris
Messages: 1 974
Par défaut

Citation:
Envoyé par Michel Voir le message
ODBC et le driver fournit par mysql non
Je rajouterais même MyODBC
Le driver odbc pour Mysql
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/01/2008, 10h19   #30 (permalink)
Membre éprouvé
 
Avatar de nounetmasque
 
Date d'inscription: janvier 2003
Localisation: A la campagne
Messages: 425
Par défaut

Bonjour,

je ne sais pas trop si cette question est déjà posée dans la FAQ, en tout cas j'ai rencontré le problème ce matin à savoir calculer l'âge d'un individu en fonction de sa date de naissance au format date %d/%m/%Y et je propose cette solution :

Code :
 
SELECT
      YEAR(NOW()) - YEAR(DATE_NAISSANCE) +
      IF(DATEDIFF(
           STR_TO_DATE(CONCAT('0001', DATE_FORMAT(NOW(), '%d%m')), '%Y%d%m'),
           STR_TO_DATE(CONCAT('0001', DATE_FORMAT(DATE_NAISSANCE, '%d%m')), '%Y%d%m')
         ) < 0, -1, 0)
FROM DUAL
 
En espérant que ce bout de code puisse aider du monde
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

Dernière modification par nounetmasque ; 13/03/2008 à 11h40
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation
NEWS MYSQLF.A.Q MYSQLSOURCES MYSQLTUTORIELS MYSQLOUTILS MYSQLLIVRES MYSQL

Réponse

Précédent   Forum des développeurs > Bases de données > MySQL > Contribuez



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide