» InnoDB Volltextsuche viel langsamer als MyISAM

Gäste suchen nicht mehr liveNeuen Thread eröffnenNeue Antwort erstellenGroß- und Kleinschreibung ist unentbehrlich
AutorNachricht
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 52420
Wohnort: Lohmar


Meine eBay-Auktionen:
12.02.2017, 21:51
zitieren

Leider haben wir massive Performance-Probleme mit der neuen Suche. Ich habe schon eine Weile herumprobiert und es scheint tatsächlich so zu sein, das MySQL 5.6 und die neue InnoDB Volltextsuche deutlich langsamer ist das bisher genutzte MyISAM Format.

Ich habe z.B. 3-stellige Suchwörter per Zufall generiert und auf die InnoDB Tabelle losgelassen:
mysql>SELECT SQL_NO_CACHE
topic_id
FROM
topics_search_innodb
WHERE
host_id = 1
AND
forum_id IN (23, 50)
AND
MATCH(topic_text) AGAINST('+ras' IN BOOLEAN MODE)
ORDER BY
MATCH(topic_text) AGAINST('+ras' IN BOOLEAN MODE) DESC
LIMIT 1000
Empty set (58 ms)

1000 iterations:
zum: 4063 ms (CPU 21.75%)
xxx: 1347 ms (CPU 19.875%)
uhr: 1332 ms (CPU 23%)
aba: 739 ms (CPU 17.25%)
abe: 593 ms (CPU 26.125%)
ami: 541 ms (CPU 18.25%)
wow: 490 ms (CPU 17.75%)
ftw: 430 ms (CPU 17%)
sub: 377 ms (CPU 17.25%)
jim: 344 ms (CPU 21.75%)
oho: 325 ms (CPU 18.25%)
iwo: 316 ms (CPU 16.625%)
ice: 309 ms (CPU 16.625%)
sms: 295 ms (CPU 23%)
rip: 237 ms (CPU 18.25%)
oha: 236 ms (CPU 17.375%)
ajr: 228 ms (CPU 17.75%)
ost: 224 ms (CPU 18.25%)
abs: 215 ms (CPU 23%)
auh: 212 ms (CPU 18.25%)
suy: 203 ms (CPU 17.375%)
gtt: 200 ms (CPU 19.25%)
cih: 199 ms (CPU 16.625%)
ggg: 192 ms (CPU 19.25%)
omo: 192 ms (CPU 23%)
fzg: 181 ms (CPU 17.75%)
ben: 166 ms (CPU 17.25%)
pop: 166 ms (CPU 17.75%)
sqb: 164 ms (CPU 21.75%)
egs: 158 ms (CPU 19.875%)
asu: 154 ms (CPU 18.25%)
tel: 149 ms (CPU 17%)
aua: 143 ms (CPU 26.125%)
nih: 142 ms (CPU 17.375%)
llk: 133 ms (CPU 26.125%)
enf: 131 ms (CPU 26.125%)
ski: 130 ms (CPU 18.25%)
gth: 129 ms (CPU 17.375%)
ega: 117 ms (CPU 21.75%)
kun: 112 ms (CPU 17.75%)
ett: 111 ms (CPU 18.25%)
wap: 109 ms (CPU 26.125%)
toy: 107 ms (CPU 23%)
gwb: 105 ms (CPU 17.375%)
ral: 100 ms (CPU 17.75%)
btt: 99 ms (CPU 19.875%)
bug: 98 ms (CPU 17%)
tri: 98 ms (CPU 16.625%)
wtc: 96 ms (CPU 26.125%)
nxt: 95 ms (CPU 17.625%)
hoy: 92 ms (CPU 17.25%)
gts: 90 ms (CPU 19.25%)
cih: 88 ms (CPU 26.125%)
szb: 87 ms (CPU 23%)
shw: 87 ms (CPU 17.375%)
iaq: 87 ms (CPU 26.125%)
abc: 87 ms (CPU 19.875%)
ure: 87 ms (CPU 18.25%)
nrb: 86 ms (CPU 16.625%)
asi: 86 ms (CPU 19.875%)
zoo: 86 ms (CPU 16.625%)
hsk: 85 ms (CPU 17.375%)
nea: 85 ms (CPU 17.75%)
mea: 85 ms (CPU 23%)
def: 84 ms (CPU 17.75%)
vik: 83 ms (CPU 17.375%)
wog: 83 ms (CPU 19.25%)
vsm: 82 ms (CPU 26.125%)
sem: 82 ms (CPU 17%)
grr: 81 ms (CPU 18.25%)
hee: 81 ms (CPU 26.125%)
ivi: 80 ms (CPU 17.75%)
mkb: 80 ms (CPU 17.625%)
wet: 80 ms (CPU 19.875%)
aby: 80 ms (CPU 26.125%)
heb: 79 ms (CPU 17.375%)
wha: 78 ms (CPU 23%)
hhi: 77 ms (CPU 17.25%)
hdn: 76 ms (CPU 26.125%)
cad: 75 ms (CPU 17.25%)
eyy: 74 ms (CPU 23%)
aih: 74 ms (CPU 21.75%)
dnn: 73 ms (CPU 17%)
...
alle weiteren 32-72 ms

Da mir das viel zu langsam vorkam, habe ich die Tabelle kopiert und als MyISAM abgespeichert und den Vorgang wiederholt:
mysql>SELECT SQL_NO_CACHE
topic_id
FROM
topics_search_myisam
WHERE
host_id = 1
AND
forum_id IN (23, 50)
AND
MATCH(topic_text)AGAINST ('+xbm' IN BOOLEAN MODE)
ORDER BY
MATCH(topic_text) AGAINST('xbm') DESC
LIMIT 1000
Empty set (4 ms)

1000 iterations:
mal: 913 ms (CPU 15.875%)
aus: 685 ms (CPU 15.875%)
hey: 253 ms (CPU 15.875%)
hmm: 150 ms (CPU 15.875%)
tut: 145 ms (CPU 15.875%)
art: 136 ms (CPU 15.875%)
uhr: 87 ms (CPU 15.875%)
gas: 75 ms (CPU 15.875%)
bmw: 71 ms (CPU 15.875%)
geb: 69 ms (CPU 15.875%)
gib: 59 ms (CPU 15.875%)
std: 41 ms (CPU 15.875%)
aba: 40 ms (CPU 15.875%)
oha: 35 ms (CPU 15.875%)
les: 35 ms (CPU 15.875%)
ori: 31 ms (CPU 15.875%)
gti: 31 ms (CPU 15.875%)
dom: 29 ms (CPU 16.625%)
ect: 29 ms (CPU 15.875%)
tim: 27 ms (CPU 15.875%)
lsd: 24 ms (CPU 15.875%)
tee: 24 ms (CPU 15.875%)
gtr: 23 ms (CPU 15.875%)
yak: 22 ms (CPU 15.875%)
bye: 22 ms (CPU 15.875%)
abo: 21 ms (CPU 15.875%)
pix: 20 ms (CPU 15.875%)
asu: 18 ms (CPU 15.875%)
rom: 16 ms (CPU 15.875%)
pop: 16 ms (CPU 15.875%)
jou: 16 ms (CPU 16.625%)
pop: 15 ms (CPU 15.875%)
dts: 15 ms (CPU 15.875%)
tow: 15 ms (CPU 15.875%)
ray: 15 ms (CPU 15.875%)
ray: 14 ms (CPU 15.875%)
ouh: 14 ms (CPU 15.875%)
biw: 13 ms (CPU 15.875%)
cya: 13 ms (CPU 15.875%)
wfs: 12 ms (CPU 15.875%)
key: 12 ms (CPU 15.875%)
asi: 12 ms (CPU 15.875%)
ece: 11 ms (CPU 16.625%)
oja: 11 ms (CPU 15.875%)
moi: 11 ms (CPU 15.875%)
deh: 10 ms (CPU 15.875%)
aaa: 10 ms (CPU 15.875%)
vii: 10 ms (CPU 15.875%)
ffm: 10 ms (CPU 15.875%)
hjs: 9 ms (CPU 15.875%)
dis: 9 ms (CPU 15.875%)
nat: 9 ms (CPU 15.875%)
wal: 9 ms (CPU 15.875%)
ghz: 8 ms (CPU 15.875%)
dry: 8 ms (CPU 15.875%)
slr: 8 ms (CPU 15.875%)
aml: 8 ms (CPU 15.875%)
erm: 8 ms (CPU 15.875%)
gsx: 8 ms (CPU 15.875%)
swf: 8 ms (CPU 15.875%)
vln: 8 ms (CPU 15.875%)
tob: 7 ms (CPU 15.875%)
gra: 7 ms (CPU 16.625%)
kaw: 7 ms (CPU 15.875%)
mil: 7 ms (CPU 15.875%)
gra: 7 ms (CPU 15.875%)
sic: 7 ms (CPU 15.875%)
ahm: 7 ms (CPU 15.875%)
mrs: 6 ms (CPU 15.875%)
gtv: 6 ms (CPU 15.875%)
thw: 6 ms (CPU 15.875%)
gto: 6 ms (CPU 15.875%)
aal: 6 ms (CPU 15.875%)
jem: 6 ms (CPU 15.875%)
jux: 6 ms (CPU 15.875%)
wel: 6 ms (CPU 15.875%)
aeg: 6 ms (CPU 15.875%)
irr: 6 ms (CPU 15.875%)
hsb: 6 ms (CPU 15.875%)
alle weiteren 0-5 ms

Dabei fällt erschreckend auf:
  • InnoDB ist deutlich langsamer
  • InnoDB ist selbst langsam bei Wörtern, die nicht im Volltext-Index stehen
  • InnoDB belastet die CPU mit jeder weiteren Abfrage
Das ungewöhnliche daran ist, dass es laut meiner Recherche eigentlich anders herum sein sollte. Gründe sind mir dafür keine bekannt. Ich werde das jedenfalls zum Anlass nehmen und weiter auf MyISAM setzen.

Leider wird es dadurch wieder nicht möglich sein Operatoren wie die Wildcard sinvoll einzusetzen, da man in MyISAM keinen Relevanz-Score zurückbekommt, wenn diese eingesetzt werden. Das geht nur in InnoDB.

Demnach wird eine Suche nach "bremse* hinten" nach wie vor auch "bremsenswap hinten" finden, aber solche Threads landen dann in den Suchergebnissen ganz weit hinten, weil nur das Hauptwort "bremse" in die Bewertung einfließt. Wer sich mit Datenbanken auskennt, hier die Abfrage:
mysql>SELECT SQL_NO_CACHE
topic_id, topic_title, MATCH(topic_title) AGAINST('bremse hinten') AS score
FROM
topics_search_myisam
WHERE
host_id = 1
AND
MATCH(topic_title) AGAINST ('+bremse* +hinten' IN BOOLEAN MODE)
ORDER BY
score DESC
LIMIT 10
+----------+------------------------------------------------------------------+--------------------+
| topic_id | topic_title                                                      | score              |
+----------+------------------------------------------------------------------+--------------------+
| 259605   | Rover 4OO Bremse/Achse identisch zu Civic Bremse/Achse hinten ?? | 12.6060791015625   |
| 145944   | Bremse hinten                                                    | 11.2802734375      |
| 225338   | ITR Bremse hinten                                                | 11.154875755310059 |
| 252092   | Bremse hinten EP4                                                | 11.154875755310059 |
| 252593   | Bremse hinten Ej6                                                | 11.154875755310059 |
| 294837   | Bremse hinten hängt                                              | 11.154875755310059 |
| 343657   | EK4 Bremse hinten                                                | 11.154875755310059 |
| 376100   | Bremse hinten unterschiedlich?                                   | 11.154875755310059 |
| 86766    | Suche Ed9 Bremse hinten                                          | 11.032236099243164 |
| 126941   | BB1/2 Bremse hinten komplett                                     | 11.032236099243164 |
+----------+------------------------------------------------------------------+--------------------+
10 rows in set (31 ms)

In InnoDB ist das viel besser:
mysql>SELECT SQL_NO_CACHE
topic_id, topic_title, MATCH(topic_title) AGAINST('+bremse* +hinten' IN BOOLEAN MODE) AS score
FROM
topics_search_innodb
WHERE
host_id = 1
AND
MATCH(topic_title) AGAINST ('+bremse* +hinten' IN BOOLEAN MODE)
ORDER BY
score DESC
LIMIT 10
+----------+------------------------------------------------------------------+--------------------+
| topic_id | topic_title                                                      | score              |
+----------+------------------------------------------------------------------+--------------------+
| 259605   | Rover 4OO Bremse/Achse identisch zu Civic Bremse/Achse hinten ?? | 12.029730796813965 |
| 38209    | Bremsenswap eg4 -> scheibe hinten (ee9 teile?)                | 7.754481792449951  |
| 40011    | ANFRAGE BREMSSÄTTEL HINTEN EG/EJ/EH/EE!! BREMSENSWAP!!           | 7.754481792449951  |
| 45066    | Welche bremsen vorne und hinten?                                 | 7.754481792449951  |
| 46963    | Bremsenswap EJ9 hinten                                           | 7.754481792449951  |
| 53245    | EE8/9 Bremskraftverstärker / ITR Bremse hinten                   | 7.754481792449951  |
| 56169    | Verkaufe Bremsenswap hinten EG5                                  | 7.754481792449951  |
| 61552    | bremsenswap hinten für ej6                                       | 7.754481792449951  |
| 61695    | bremsenswap hinten ej6                                           | 7.754481792449951  |
| 63682    | Bremsen BB1 -hinten-                                             | 7.754481792449951  |
+----------+------------------------------------------------------------------+--------------------+
10 rows in set (52 ms)

Ganz verrückt ist auch, dass die InnoDB Abfragen nur zeitweise langsam sind. Es scheint eine Art Cache zu geben, den ich nicht mal mit
SQL_NO_CACHE
umgehen kann. Denn oben hatten wir ja dieses Ergebnis mit dem Wort "zum":
zum: 4063 ms (CPU 21.75%)

Ich habe daraufhin die Abfrage mit diesem Suchwort gezielt wiederholt und nach dem 3. bis 5. Versuch wird jede dieser Abfragen plötzlich deutlich schneller:
zum: 3268 ms (CPU 12.625%)
zum: 2867 ms (CPU 13.625%)
zum: 2703 ms (CPU 12.625%)
zum: 2033 ms (CPU 13.625%)
zum: 1163 ms (CPU 14.625%)
zum: 744 ms (CPU 14.625%)
zum: 730 ms (CPU 14.625%)
zum: 609 ms (CPU 14.625%)
zum: 539 ms (CPU 14.625%)
zum: 439 ms (CPU 14.625%)
zum: 390 ms (CPU 14.625%)

Die 390 ms halten sich dann einige Zeit, aber irgendwann ist es wieder langsam. Also offensichtlich ein Cache, der nach einer gewissen Zeit verschwindet. Trotzdem darf man dabei nicht außer Acht lassen, dass die CPU Last auch bei dieser einen Anfrage bei jedem Versuch merklich ansteigt.

Übrigens benötigt die Abfrage in der MyISAM-Tabelle 480 ms. Demnach wäre InnoDB zeitlich gesehen im Vorteil.

Fazit
Entweder stimmt was nicht mit unserem InnoDB Setup oder die ganzen Benchmarks da draußen basieren auf sich wiederholenden Abfragen, die durch einen Cache geschönt werden, der im Real Life irrelevant ist, da sich Suchanfragen ständig ändern.

Falls mal ein Datenbank-Spezialist über diesen Beitrag stolpert, freue ich mich auf einen Austausch zu dem Thema.


pn email
Gast 
12.02.2017, 21:51
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "InnoDB Volltextsuche viel langsamer als MyISAM" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Patent Volltextsuche in mehreren Beständen gleichzeitig
Die SIP GmbH bietet eine unabhängige Patentsuche an, die aus mehreren Datenbeständen besteht. Die Volltextsuche erreicht man über: http://www.patentfamily.de/indexsmall.aspx?lang=de&url=.%2f10_recherche%2fde%2findex_recherche.html Die Suche von...
von mgutt
0
317
01.08.2009, 10:59
mgutt
Jungs, fahrt langsamer...
http://www.osthessen-news.de/beitrag_G.php?id=1183224...
Seite 2 [Offtopic]von FG-Driver
18
1.271
23.06.2010, 13:35
cigarr
CM1 langsamer durch Klimaanlage?
Hi, mir ist an meinem Accord Tourer (CM1) aufgefallen, immer wenn ich die Klimaanlage benutze ist mein Auto wie entschleunigt. Während der Fahrt merke ich das auch das er kurz ruckelt und dann auch etwas träger ist. Auch ist er beim Anfahren nicht mehr...
[Accord 02-08]von Dani-83
1
351
13.07.2016, 17:01
RH.onda
 Internet wird stündlich langsamer! :(
Hi, bei meinem Laptop das über W-Lan mit dem Internet verbunden ist, wird von Stunde zu Stunde langsamer. Das nervt total und das Problem hab ich schon seit ein paar Monaten. :no: Mein Browser ist Mozilla Firefox, mein Laptop ein Toshiba Satellite...
Seite 2, 3, 4 [Computer & Spiele]von EJ9Driver-soon
31
888
06.11.2010, 12:39
gonzo
Winterreifen langsamer als eingetragener Geschwindigkeitsind
Ist es erlaubt Winterreifen drauf zu haben deren Geschwindigkeitsindex langsamer ist als der, der eigentlich laut Papieren nötig wäre? Also wenn ich eigentlich V haben müsste aber nur Winterreifen drauf hab die bis 180 gehen oder sowas. Kann man die...
Seite 2 [Allgemein]von ToxiT
16
859
24.08.2006, 13:40
Chris_1984
ed9 ruckelt nur noch und wird langsamer
Hi, mein ed9 nimmt seit heut morgen nur noch ruckelnd das gas an. und auf der bahn ist folgendes zubeonbachten: sehr träge bis 120 dann wird er von allein langsamer und nimmt kein gas mehr an, auf einmal gehts dann weiter und ab 150 ist alles wieder in...
Seite 2 [CRX]von japcar
12
1.164
22.01.2007, 18:33
DODGE-V8
Schleifendes Bremsgeräusch bei langsamer Fahrt - Civik FK2 (2016)
Hallo zusammen, mal wieder eine Frage zu meinem Civic. Bereits von Anfang an ist ein schleifenden Geräusch beim Bremsen in niedriger Geschwindigkeit zu vernehmen. Es ist wirklich nur bei langsamer Fahrt, also z.B. beim Rangieren oder dem Anrollen zur...
[Civic 2012-2016]von Sun Tse
4
930
27.01.2018, 08:33
Sun Tse
EG3 mit D16 Gas/Turbo Umbau und viel viel Ausstattung ;-)
Hallo, habe ein kleines Projekt vor. Habe hier ein Eg3 bj94 stehen, dem ich ein D16z6 verpassen werde. Der Civic soll ein Langstreckenfahrzeug werden und wird auf Gas umgebaut. Da aber der Spaß nicht auf der Strecke bleiben soll, soll noch zusätzlich ein...
[Civic 92-95]von nitro6
5
506
22.06.2014, 11:11
EnZyMe
Powerrohr viel viel zu leise...
Hallo, ich habe ein extrem großes Problem, finde ich :cry: Also es geht um folgendes... Ich habe einen Civic EP1 und hatte bis vor zwei Tagen ein AI von TSS und einen Powerrohr- Auspuff dran mit 4 90er Rohren. Nun habe ich vor zwei Tagen mein...
Seite 2 [Performance]von epTuner
10
1.067
29.07.2006, 18:55
exe
EG3 Verbraucht viel zu viel was machen?
hi leute MEIn EG 150tkm verbraucht viel zu viel glaub ich . Ich komme ca. 380km mit vollem tank, dass ist übel meine kumpelz kommen da schon viel weiter. Und deswegen meine frage an euch was kann ich denn machen ? Öl hab ich neu...
Seite 2 [Performance]von AND1--CiviC PoweR
13
1.242
22.01.2007, 23:32
CruX
© 2004 - 2025 www.maxrev.de | Communities | Impressum |