2017-09-27 5 views
0

Je possède ce tableau d'exemple sur MySQL v.5.7.17 (InnoDB, lignes 5,000):MySQL retour de requêtes différentes lignes après OPTIMIZE TABLE (de PHP)

+-------+----------+ | code1 | code2 | +-------+----------+ | 4714 | 15895510 | | 1041 | 10000158 | | 2866 | 10000000 | (...)

Code 1 est indexé.
Je test avec une requête simple: SELECT code2 FROM codes WHERE code1=1041

Cas 1: Je l'exécuter sur la console MySQL et retourner la valeur correcte 10000158.

Cas n ° 2: je le lance à partir de PHP (mysqli_query()) et aucune ligne retourné (mysqli_num_rows() = 0). Si je cours la même requête mais avec un code différent1 (WHERE code1=2866) j'obtiens un résultat correct: 10000000.
J'ai fait beaucoup de tests et n'ai jamais eu le rang pour code1=1041.

Enfin, je cours un OPTIMIZE TABLE codes et j'obtiens la bonne valeur de code1=1041! Je suis surpris!

Depuis la console a toujours fonctionné. A partir de PHP, certains enregistrements n'étaient pas affichés. Comment OPTIMIZE TABLE peut-il résoudre ce problème en PHP? Cela pourrait-il être une corruption dans l'index et affecter seulement le moteur PHP-Mysqli?

Merci!

+0

Je suppose que vos données sous-jacente est en train de changer. –

+0

Votre code PHP pour interroger la base de données peut-il être faux? –

+0

Lorsque j'ai détecté le problème, j'ai créé un script uniquement pour rechercher l'erreur. Ce script n'avait que le code de base pour établir la connexion ('mysqli_connect') et la requête (' mysqli_query'). Et je teste avec ('mysqli_num_rows'). À ce moment, aucun utilisateur ne modifie la table. – BeAsT

Répondre

1

Je pense que c'est un comportement attendu (ou au moins hautement probable). OPTIMIZE TABLE défragmente la base de données et les index. Si vos index ont été corrompus (ou même fortement fragmentés), cette commande les corrigera. Ma meilleure supposition est que votre index très fragmenté a expiré pendant la recherche de cette valeur et OPTIMIZE TABLE a corrigé cela.

Lire ceci: https://dev.mysql.com/doc/refman/5.7/en/optimize-table.html et aussi la réponse acceptée à this question

+0

Je comprends que ce soit ce que vous dites. Mais pourquoi cela a-t-il fonctionné directement avec la console Mysql et non avec la commande PHP? C'est la chose étrange! – BeAsT

+1

Est-ce que cela (https://stackoverflow.com/questions/12969000/identical-mysql-query-returning-different-result-in-mysql-workbench-than-from-co) aide? – Chiwda