MySQL wählt Zeilen (manchmal) nicht richtig aus

8

Dies ist ein Update zu dieser Frage, bei der ich herumwirbelte und versuchte herauszufinden, was in der Welt vor sich ging:

MySQL gibt manchmal fälschlicherweise 0 für count (*)

Ich akzeptierte eine Antwort dort, weil sie die Frage beantwortete, die ich stellte ("Warum könnte das passieren"), obwohl sie nicht die Frage beantwortete, über die ich wirklich etwas wissen wollte ("Warum passiert mir das?") ). Aber Ich habe es geschafft, bei der letzten Frage ein wenig einzugrenzen und denke, dass ich definitiv sagen kann, dass etwas auf eine Weise falsch ist, die ich nicht verstehe und noch nie zuvor gesehen habe.

Das Problem war sehr schwierig zu debuggen, weil aus Gründen, die ich nicht verstehe, die automatische Anmeldung bei der Datenbank es behebt. Heute jedoch konnte ich den problematischen Zustand bei einer offenen MySQL-Sitzung in einem Terminal auslösen. Hier sind einige Abfragen und die nachfolgenden Antworten aus dieser Sitzung:

Zuerst ist das mein Tabellenlayout:

%Vor%

Schauen wir uns jetzt an, wie viele Beiträge in einem bestimmten Forum-Thread vorhanden sind:

%Vor%

OK, aber ich möchte nur Forenbeiträge, bei denen das deleted -Flag nicht gesetzt ist:

%Vor%

OK, lassen Sie uns einfach doppelt sicherstellen, dass sie nicht wirklich alle gelöscht werden:

%Vor%

Jede Zeile in dieser Tabelle hat "deleted" auf 0 gesetzt, und dennoch fügt das Hinzufügen von and deleted=0 zur Abfrage keine Ergebnisse. Bis ich eine neue Sitzung öffne, indem ich mich wieder von einem Terminalfenster aus bei MySQL anmelde, nach dem ich wieder richtig Zeilen auswählen kann, wo 'gelöscht' 0 ist.

Was in aller Welt?

UPDATES:

@ miken32 in den Kommentaren vorgeschlagen, ich versuche ein EXPLAIN SELECT ... , also:

%Vor%     
Mala 07.11.2015, 22:45
quelle

2 Antworten

3

Basierend auf dem Kommentar, dass die Verwendung von FORCE KEY das Ergebnis der Abfrage ändert, ist es sehr wahrscheinlich, dass es sich um den Merge-Optimizer-Fehler handelt. EXPLAIN der ursprünglichen Abfrage zeigt, dass die Optimierung durchgeführt wird, indem aus dem gelöschten Schlüssel ausgewählt wird, dann aus dem Schlüssel post_id, und dann die Ergebnisse zusammengeführt werden. Wenn wir diesen Code umgehen müssen, verschwindet das Problem.

Die Schritte von dem Punkt:

  • versuchen Sie es auf den gleichen Daten mit der neuesten Version 5.6 von MySQL
  • Wenn das Problem reproduziert wird, versuchen Sie, es auf den minimalsten Testfall zu isolieren, besuchen Sie Ссылка und melden Sie den Fehler
Sasha Pachev 09.11.2015, 20:59
quelle
0

Vertreibe die Dämonen und Geister! Fügen Sie diesen Index hinzu, um "Merge" Bug zu vermeiden:

%Vor%

Ein Index für eine Flagge ist fast immer nutzlos. Diesmal war es schlimmer als nutzlos.

Dies wird billiger, schneller und sicherer als FORCE INDEX.

    
Rick James 01.12.2015 22:02
quelle

Tags und Links