SELECT * FROM tbl_orders_log WHERE TRANSACTION_ID=(SELECT o.PAYMENT_TRANSACTION_LOG_ID FROM tbl_order_head AS o WHERE o.VISUAL_ID = '77783');
3 Réponses :
Parce que quelqu'un a enfermé une des tables ou une seule rangée. Cela peut arriver, par exemple, si vous avez désactivé Auto commit (vous pouvez donc annuler vos modifications) au cours d'une session et oublié de commettre-la. P>
Ce document pourrait aider. p>
[EDIT] Après avoir posturé les définitions de tables, vous pouvez voir que les types des deux colonnes de jointure sont différents. Maintenant, la question est la suivante: quel type sera diffusé de haut en bas lorsque vous exécutez la requête? Dans votre cas, il pourrait être préférable de lancer le type de De cette façon, quelques lignes (ou même une seule) de la table patay_transaction_log_id code> à varchar code>, surtout si vous avez un index sur transaction_id code> (que vous devriez créer pour cette requête). P>
tbl_order_head code> sera sélectionnée, puis une recherche rapide se produit dans la table tbl_orders_log code>. Sans cela, la base de données chargera tous les enregistrements de la table des journaux et vérifiera chaque enregistrement pour une correspondance dans les en-têtes de commande trouvés (plus la mise en oeuvre de chaque ID sur le type de l'en-tête, etc.). P>
HMM n'a jamais envisagé cela, mais je passe la requête à partir d'une console sur un serveur en direct. Je suppose que des enregistrements individuels pourraient être verrouillés, mais comment puis-je dire? Et dans tous les cas, je peux voir les tables individuelles?
Voir le lien pour déterminer les serrures et les blocages.
Créé un index pour transaction_id et la requête couru immédiatement. Donc cela a résolu mon problème, merci
Avez-vous exécuté Expliquez sur votre requête pour voir Le plan de requête?
EXPLAIN SELECT * FROM tbl_order_head AS o INNER JOIN tbl_orders_log AS c ON o.PAYMENT_TRANSACTION_LOG_ID=c.TRANSACTION_ID WHERE o.VISUAL_ID = '77783'
"ID" expliquée, "SELECT_TYPE", "TABLE", "TYPE", "POSSIBLE_KEYS" "," KEY _LEN "," REF "," ROWS "," Extra "" 1 ", "Simple", "c", "tout", \ n, \ n, \ n, \ n, "16633", "" "1", "simple", "o", "tout", \ n, \ N, \ n, \ n, "59696", "Utiliser où"
On dirait qu'il effectue une balayage de table (examiner toutes les lignes), il vous aiderait si vous pouviez
Je peux maintenant voir que les transactions indexées sont une Varcharchar (1000) et l'autre champ de texte bizarrely (base de données non conçue par moi)
Le réglage d'une longueur de 1000 sur un Varchar n'est sans signification que la longueur maximale d'un champ est de 255 caractères. Si vous avez besoin de plus de stockage, vous devez utiliser un champ de texte, mais également à l'aide de la performance d'impact sur Text / Blobs. dev.mysql.com/doc/refman/5.0/fr/blob. HTML Je pense que cela devrait être o.transaction_id et c.payment_transaction_log_id au lieu de c.transaction_id et o.payment_transaction_log_id. Ensuite, la requête devrait ressembler à ceci: Afficher créer une table \ g code> pour vos tables de cette requête et incluez-la dans votre question.
votes
Avez-vous vérifié votre base de données si l'une de ces tables est verrouillée?