Portal > Foren > Datenbanken, Server, Betriebssysteme und sonstige Programmiersprachen > Datenbanken > MySQL Fehlermeldung: Your query requires a full tablescan ...
Antwort
 
Themen-Optionen
Alt 29.07.2006, 19:29 Nach oben    #1
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard MySQL Fehlermeldung: Your query requires a full tablescan ...

Tag,
nun, ich hab etwas ne Zeit lang lokal auf meinem Rechner (Windows) programmiert und jetzt mal versucht, online zu stellen. Nun erhalte ich beim Aufruf folgende Fehlermeldung:
Zitat:
mysql_query( Your query requires a full tablescan (table xpc1_language_de, 41 rows affected). Use EXPLAIN to optimize your query.
Gut, hab ich wohl Mist im MySQL-Query gebaut. Der wird mit Hilfe der TemplateEngine gebildet, die sich die aus der Datenbank zu ersetzenden Sprachvariablen holt und daraus einen Query bildet.
Der sieht nälmich bisher so aus:

Code:
SELECT
        text, identifier
FROM
       xpc1_language_de
WHERE
        identifier = 'username' OR identifier = 'password' OR identifier = 'loginas' OR identifier = 'online' OR identifier = 'busy' OR identifier = 'rightback' OR identifier = 'away' OR identifier = 'longeraway' OR identifier = 'invisible' OR identifier = 'loginbutton'
Im Code wird halt einfach für jede Sprachvariable (identifier), das benötigt wird, ein OR identifier = '$variable' gesetzt.

Lokal funktioniert das ohne Probleme (MySQL 5.0.20-community) innerhalb Bruchteilen von Sekunden, online auch (zumindest in phpMyAdmin), bekomme jedoch die gegebene Fehlermeldung (MySQL 3.23.49-log, omg, ich hab noch mysql3) ..

Nun bräucht ich mal eure Hilfe beim optimieren vom Query, wie könnt ich den vereinfachen bzw verbessern?

//edit: Index liegt natürlich auf identifier.

Mal ein Quote aus phpmyadmin:
Zitat:
table | type | possible_keys | key | key_len | ref | rows | Extra
xpc1_language_de | ALL | identifier|NULL|NULL|NULL|41|where used
Bei weniger WHERE-Abfragen wird der Query jedoch ausgeführt, und zwar ohne Fehlermeldung o.ä. - in phpmyadmin bekomm ich dann sogar einen ganz anderen, richtigen EXPLAIN.

//edit2:
Seltsam, lass ich im Sql-Query das letzte "OR identifier = 'loginbutton'" weg, funktioniert der Query, bzw das EXPLAIN genauso, wie es funktionieren soll - füge ich es wieder hinzu, tritt der Fehler wieder auf. Dabei ist es egal, was das für ein identifier ist, ob 'loginbutton' oder 'registerhead' usw.. An was könnte das liegen?
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (29.07.2006 um 20:53 Uhr).
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.07.2006, 07:30 Nach oben    #2
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

Ich vermute Punkt 3:
http://dev.mysql.com/doc/refman/4.1/...able-scan.html
Das sollte weggehen, wenn die Tabelle grösser wird, füll die mal Testweise mit Dummy-Einträgen, dann sollte der Full-Table-Scan weggehen.

Wenn ich Recht habe, ist die Fehlermeldung dein einziges Problem und Du solltest diese ignorieren/unterdrücken.
Waq ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.07.2006, 14:18 Nach oben    #3
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Also als erstes solltest du mindestens die Spalte "text" in "`" setzen: "`text`", da es sich bei dem Wort "text" um ein reserviertes Wort handelt.

Dann würde ich dir aber auch noch empfehlen die Funktion "FIND_IN_SET" zu nutzen: http://dev.mysql.com/doc/refman/5.1/...functions.html

Ich könnte mir vorstellen, dass die etwas performanter ist, musst du mal ausprobieren
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.07.2006, 15:52 Nach oben    #4
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Das sollte weggehen, wenn die Tabelle grösser wird, füll die mal Testweise mit Dummy-Einträgen, dann sollte der Full-Table-Scan weggehen.

Wenn ich Recht habe, ist die Fehlermeldung dein einziges Problem und Du solltest diese ignorieren/unterdrücken.
Okay, danke, im Laufe der Entwicklung wird die eh noch größer, werde das dann mal testen.

Zitat:
Also als erstes solltest du mindestens die Spalte "text" in "`" setzen: "`text`", da es sich bei dem Wort "text" um ein reserviertes Wort handelt.
Ups, ganz übersehen. Habs lieber gleich mal in phraseContent unbenannt.

Zitat:
Dann würde ich dir aber auch noch empfehlen die Funktion "FIND_IN_SET" zu nutzen: http://dev.mysql.com/doc/refman/5.1/...functions.html

Ich könnte mir vorstellen, dass die etwas performanter ist, musst du mal ausprobieren
Danke, wer dich mir mal ansehen.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.07.2006, 17:06 Nach oben    #5
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Eventuell hilft auch einfach ein "MATCH AGAINST" mit Volltext-Schlüssel über das Feld, auf jedenfall sieht der Query dann deutlich schlanker aus
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2006, 13:13 Nach oben    #6
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

//edit
Okay, ich hab das jetzt mit IN() gelöst:
Code:
SELECT phraseContent, identifier FROM xpc1_language_de WHERE phraseContent in ('field1','field2','field3');
Das Funktioniert einwandfrei. Allerdings bekomme ich dieselbe Fehlermeldung beim nächsten Query, der dafür zuständig ist, die User auszulesen die online sind und sich in einem Raum befinden:
Code:
SELECT
        u.id AS userID, u.username,
        c.id AS roomID, c.roomname
FROM
        xpc1_users AS u
LEFT JOIN
        xpc1_chatrooms AS c
ON
        u.chatroom = c.id
WHERE
        u.chatroom != '0' AND
        u.isOnline = '1'
Die Fehlermeldung ist die Selbe wie die davor:
Zitat:
Notice: mysql_query( Your query requires a full tablescan (table u, 12 rows affected). Use EXPLAIN to optimize your query. in file /core/mysql.model.php on line 332
Notice: mysql_query( Your query requires a full tablescan (table c, 1 rows affected). Use EXPLAIN to optimize your /core/mysql.model.php on line 332
Indizies liegen auf u.username (u.id = PRIMARY) und u.chatroom, c.roomname und c.id ist wieder PRIMARY.
Mittels EXPLAIN bekomm ich sowohl für table 'u' als auch für table 'c' den TYPE 'all' was nicht gut ist.. Wie kann ich diesen Query optimieren?
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (31.07.2006 um 13:50 Uhr).
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2006, 14:25 Nach oben    #7
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
Standard

läuft das php in ner art debugmode ?
will auch mal solche ausgaben!
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2006, 14:44 Nach oben    #8
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von robo47
läuft das php in ner art debugmode ?
will auch mal solche ausgaben!
Ne nich wirklich, hab nur das ErrorReporting eingestellt:
PHP-Code:
<?php
error_reporting
(E_ALL);
ini_set('display_errors'true);
ini_set('mysql.trace_mode'true); // <-- vielleicht meinst du das?
?>
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2006, 15:24 Nach oben    #9
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
Standard

oha, toll, das kannte ich noch ned, das muss ich mal testen.

danke

mfg
robo47
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2006, 18:43 Nach oben    #10
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von robo47
oha, toll, das kannte ich noch ned, das muss ich mal testen.

danke

mfg
robo47
Kein Problem. Mein Problem dagegen besteht immer noch.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2006, 20:42 Nach oben    #11
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Hast du bei den Tabellen auch Indizes gesetzt? Könnte sein, dass das damit zu tun hat. Wenn nciht: Dann mach das mal so schnell wie möglich, da ohne Indizes immer die komplette Tabelle durchsucht werden muss.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2006, 21:24 Nach oben    #12
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von mir
Indizies liegen auf u.username (u.id = PRIMARY) und u.chatroom, c.roomname und c.id ist wieder PRIMARY.
Mittels EXPLAIN bekomm ich sowohl für table 'u' als auch für table 'c' den TYPE 'all' was nicht gut ist.. Wie kann ich diesen Query optimieren?
Na klar, und zwar auf dein meistverwendeten Spalten..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.07.2006, 21:45 Nach oben    #13
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 684
Standard

Ups, sorry, hatte ich überflogen...
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dynamische mySQL Query la-finest PHP-Programmierung 2 25.01.2007 16:36
Auslesen zweier verschiedener Datensätze in einem Query (mySQL) Chr!s Datenbanken 8 14.11.2006 19:57
Your most abnormal Query Guradia Datenbanken 21 19.04.2006 00:15
MySQL Query wird nicht ausgeführt Garnele Datenbanken 6 01.04.2006 03:17
MySQL 5.1 kommt in die Beta-Phase Ben Nachrichten 1 02.03.2006 14:31


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:18 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44