Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

MySQL-Abfrage sehr langsam (Faktor 300)

Frage Entwicklung Datenbanken

Mitglied: Chris-U

Chris-U (Level 1) - Jetzt verbinden

27.10.2008, aktualisiert 30.10.2008, 7966 Aufrufe, 6 Kommentare

MySQL Abfrage sehr langsam sobald in 2 verknüpften Tabellen gesucht wird.

Habe 2 Tabellen A und B. Die Datensätze lassen sich über eine ID verknüpfen. In beiden Tabellen soll je ein Feld nach einem string durchsucht werden.
Meine SQL-Abfrage sieht so aus:


SELECT `name` , `B`.`WERT2`
FROM `A`
LEFT JOIN `B` ON `A`.`id` = `B`.`id`
WHERE `A`.`name` LIKE '%test3%'
OR `B`.`WERT2` LIKE '%test3%'


In den Tabellen sind jeweils 1600 Datensätze. Die Abfrage dauert 7,8 Sekunden!!!!!!
Sobald ich die Prüfung
"OR `B`.`WERT2` LIKE '%test3%'"
weg lasse ist die abfrage 300mal so schnell fertig (0,026 sek) wie mit der zusätzlichen abfrage.
auch wenn ich den ersten teil der WHERE Abfrage weg lasse, also den Teil:
"`A`.`name` LIKE '%test3%' "
ist es ca. 300mal schneller als mit beiden Abprüfungen.

Hat jemand ne Idee, wie ich die Abfrage mit beiden Abprüfungen performanter hin bekommen kann?


Vielen dank schonmal!

Gruß,
Christopher
Mitglied: Biber
27.10.2008 um 15:35 Uhr
Moin Chris-U,

Hat jemand ne Idee, wie ich die Abfrage mit beiden Abprüfungen performanter hin bekommen kann?
Idee 1: Redesign.
kann doch wohl nicht sein, dass ein Suchwert mal in "A.Name" und mal in "B.Wert2" stehen darf..
Aber das wolltest Du wahrscheinlich nicht wissen...

Idee 2
01.
SELECT 'A'.`name` , `B`.`WERT2` 
02.
FROM `A`  
03.
LEFT JOIN `B` ON `A`.`id` = `B`.`id`  
04.
WHERE `A`.`name`|| B.Wert2 LIKE '%test3%' 
Grüße
Biber
Bitte warten ..
Mitglied: Chris-U
27.10.2008 um 16:55 Uhr
Hi und danke für die schnelle Antwort!

Idee 1 geht leider nicht. Es handelt sich bei der Abfrage um eine Suchfunktion in einem Onlineshop wo mehrere Felder vom Artikelstamm geprüft werden müssen, z.b. Art-Nr Art-Bezeichnung, Beschreibung usw... Habe den Beispielcode oben stark vereinfacht und in der Form auch getsetet.

Idee 2 habe ich probiert, leider kein Erfolg, ist genauso langsam wie vorher.
Problem besteht wohl, wenn ich in 2 versch Tabellen suche.

Vllt gibts ja noch ein paar gute Vorschläge!

Schönen Feierabend!

Christopher
Bitte warten ..
Mitglied: Biber
27.10.2008 um 18:15 Uhr
Moin Chris-U,

kannst Du mal zum Spass die A.ID mit in die Select-Feldliste aufnehmen (zusätzlich zu "name" und "wert2") und prüfen, ob es Auswirkungen auf die Performance hat?

A.ID und B.ID sind doch auch die PKs der Tabellen A und B?

Grüße
Biber
Bitte warten ..
Mitglied: Chris-U
28.10.2008 um 08:57 Uhr
Werd ich probieren, komme aber erst heute am späten nachmittag oder morgen dazu, da ich heute außer haus sein werde.
Würde mich auch über noch mehr vorschläge freuen.

Habe heute schon verucht das mit einem Subselect zu lösen, aber hatte noch ein Syntax-Problem^^
Bitte warten ..
Mitglied: Chris-U
29.10.2008 um 11:38 Uhr
@Biber: hat leider nicht geholfen

Für den Augenblick habe ich eine Lösung gefunden, die für meine Bedürfnisse ausreicht, aber das Problem eigentlich nicht generell behebt.

In meinem Fall existiert zu jedem Datensatz aus Tabelle A genau ein Datensatz in Tabelle B.
Ich habe den LEFT JOIN zu einem einfachen JOIN gemacht und schon ist die Abfrage wieder flott.

Allerdings kann man bei der Problemstellung nicht immer davon ausgehen dass eine 1:1 Zuordnung möglich ist. Rein von der Logik her gesehen müsste auch ich in meinem Fall einen LEFT JOIN verwenden. Nur durch andere Umstände ergibt sich bei mir der Sonderfall, dass eine 1:1 Zuordnung möglich ist.

Ich kennzeichne das Thema noch nicht als gelöst, da noch keine Lösung gefunden wurde, den LEFT JOIN zu beschleunigen.

In meinem Sonderfall wird auch in beiden durchsuchten Feldern nach dem gleichen String gesucht, daher ist es auch denkbar mit:
WHERE concat(`A`.`name`, `B`.`Wert2`) LIKE "%test3%"
den string zu suchen. Auch concat arbeitet sehr schnell, aber kann andere Probleme mit sich bringen und funktioniert auch nur in meinem Sonderfall.

Es sind also noch weitere Lösungen gesucht.

Grüße,
Christopher
Bitte warten ..
Mitglied: godlie
30.10.2008 um 16:12 Uhr
hallo wie wäre es denn mit Indizies über die Spalten A.Name und B.Wert ?
Da es sich ja nur um Strings handeln sollte,......

http://dev.mysql.com/doc/refman/5.1/de/mysql-indexes.html

Aber im allgemeinen, überleg dir ein Redesign der DB hab selber solch furchtbar betreuen müssen, dass geht auf Dauer schief.

grüße
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
PHP
MySQL-Abfrage mit php: Wert + true bzw. false (2)

Frage von tomolpi zum Thema PHP ...

Datenbanken
gelöst MYSQL Abfrage (20)

Frage von datadexx zum Thema Datenbanken ...

C und C++
gelöst IF Abfrage funktioniert nicht mehr (2)

Frage von pablovic zum Thema C und C ...

Datenbanken
gelöst SQL-Abfrage - DISTINCT - letztes Datum (3)

Frage von emeriks zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...