[PHP/MySQL] Beste search methode voor InnoDB

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn vraag aan jullie is hoe kan ik het beste een InnoDB database doorzoeken, er is immers geen fulltext index beschikbaar.
Het gaat om het zoeken in 3 of minder velden van een tabel met 900.000 records.
Alle kolommen zijn varchars met een gem. lengte van 10 tekens, een ervan heeft een index.
Er is ook een kopie van deze tabel beschikbaar in de vorm van een heap tabel.

Hoe pak ik dit het beste aan?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb al nagedacht over er de zelfde tabel op na te houden in MyISAM formaat, alleen ik denk dat dat te zwaar wordt.
Er moeten dan bij elke insert/update 3 tabellen worden aangepast.

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
SQL:
1
WHERE `veldnaam` LIKE '%zoektexthierdus%'

:?

verder snap ik je 2de post niet.. je zegt 'zoeken in een innodb' waarom zou je dan bij elke insert/update 3 tabellen willen aanpassen?

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Hier komen ze met een zelfde oplossing wbt een kopie er op nahouden. Een snelle google komt overigens ook uit op sphinx. Is dat geen optie?

BasieP: Het hele probleem is hier dat je in innodb de textkolommen niet kunt indexeren. Je kunt dan met zulke SQL aankomen, maar op een miljoen records duurt het dan ongeveer 2 minuten met wat mazzel. Ergo: lees de draad voor je blaat.

[ Voor 13% gewijzigd door Verwijderd op 13-08-2006 12:41 ]


Acties:
  • 0 Henk 'm!

  • kmf
  • Registratie: November 2000
  • Niet online

kmf

Wat ik deed is de database te repliceren naar een andere server die geen innodb heeft, en waar ik dus wel fulltext kan searchen.

One thing's certain: the iPad seriously increases toilet time.. tibber uitnodigingscode: bqufpqmp


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Is de makkelijkste oplossing niet om de tekst in een MyISAM tabel gooien en de twee tabellen te joinen? Je kan de integriteit niet door een stricte foreign key in de gaten laten houden, maar dat is in principe niets dat je met zorgvuldig inserten en een reguliere controle niet in de smiezen kan houden.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
athlonkmf schreef op zondag 13 augustus 2006 @ 14:42:
Wat ik deed is de database te repliceren naar een andere server die geen innodb heeft, en waar ik dus wel fulltext kan searchen.
Ik heb nog een server staan die niks doet.
Hierop zal ik dan wel kopie van tabel zetten met bewuste kolommen.
Hoe kan ik dit het beste aanpakken?
Deze server staat namelijk niet in het netwerk met andere DB server.
Kan ik beste elke nacht om 3 uur kopie maken of elke insert en update op beide server uitvoeren?

Acties:
  • 0 Henk 'm!

  • Mister_X
  • Registratie: Februari 2000
  • Laatst online: 17-04 14:07
Met mysql heb je soort van master slave princiepe? 2 mysql databases kan je automatisch laten synchroniseren, wij gaan het op ons werk opzetten, 1 database voor updates/inserts/selects (die staat op het www), en 1 in ons intranet die alleen selects te verwerken krijgt, zodat we wat sneller de data op ons scherm krijgen.

http://mysql.com/doc/refman/5.0/en/replication.html

[ Voor 7% gewijzigd door Mister_X op 14-08-2006 21:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Een hele kopie lijkt me overdreven in mijn geval.
Ik heb maar 4 velden uit 1 tabel nodig.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op dinsdag 15 augustus 2006 @ 14:06:
Een hele kopie lijkt me overdreven in mijn geval.
Ik heb maar 4 velden uit 1 tabel nodig.
Dan is het vast, gegeven jouw set-up, makkelijker om gewoon een kopie van die velden uit die tabel bij te houden in een losse zoektabel (myisam of wat je maar wil). Het idee van athlonkmf basseert zich er juist op dat ie door gebruik te maken van mysql replicatie (servers moeten dan wel in hetzelfde netwerk zitten) een 1:1-kopie krijgt zonder er - buiten de replicatie - moeite voor te hoeven doen.

Acties:
  • 0 Henk 'm!

  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 17:48
Wat ook helpt, is ervoor te zorgen dat de query echt zo weinig mogelijk wordt uitgevoerd. Gezien het gecombineerd wordt met PHP, voorkomen dus dat de query 6x of 7x wordt uitgevoerd om 1-maal het scherm op te bouwen :)
Klinkt misschien wel stom, maar het gebeurt vaak genoeg.

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD


Verwijderd

Topicstarter
Wat kan ik dan het best doen om die velden in MyISAM tabel te krijgen:
    • MyISAM tabel aanmaken met de juiste columns en fulltext index erop zetten.
    • Vanuit originele tabel de velden kopiëren naar de MyISAM tabel
    • Voortaan bij elke update InnoDB MyISAM ook updaten
    • MyISAM tabel aanmaken met de juiste columns en fulltext index erop zetten.
    • Vanuit originele tabel de velden kopiëren naar de MyISAM tabel
    • Elke dag opnieuw invullen om 3 uur s'nachts

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

De beslissing m.b.t. het 3e bulletpoint ligt voor een groot deel aan de belangrijkheid die er gehecht wordt aan de beschikbaarheid van de informatie die die dag is toegevoegd.

Op het moment dat die informatie "real-time" moet kunnen worden doorzocht lijkt me dat de beslissing eigenlijk al voor je genomen is...

Verwijderd

Vanaf MySQL 5.0.2 worden triggers ondersteund. Mocht je de mogelijkheid hebben om MySQL te updaten (dus niet gebonden aan een provider die vasthoudt aan 4.x of 3.x), dan zou je met insert/update/delete triggers op die InnoDB tabel je MyISAM schaduwtabel kunnen bijwerken.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Nadeel daarvan (en ook van domweg inserts doen) is natuurlijk dat MyISAM niet bijster geschikt is voor multiple writers (tegelijk), waardoor je alsnog tegen de nadelen van MyISAM aan kan lopen terwijl je hoofdtabel juist met reden InnoDB is...

Verwijderd

Naar ik begrijp gaat 't maar om 3 of 4 velden (+ de PK) die in die MyISAM tabel hoeven te komen. Bij inserts en deletes zul je sowieso al die schaduwtabel moeten bijwerken, en bij updates kun je in de trigger eerst checken of die paar velden uberhaupt wel gewijzigd zij (old en new vergelijken) alvorens je die MyISAM tabel bijwerkt.

't Zou natuurlijk mooier zijn wanneer InnoDB wel op tekstvelden kon indexeren, maar als dat niet kan is zo'n MyISAM schaduwtabel met maar een paar velden volgens mij een prima noodoplossing.
Allicht zal met reden voor InnoDB gekozen zijn, maar het snel zoeken op tekstvelden was zo te zien niet 1 van de hoofdredenen. ;)

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Ik weet niet in hoeverre MySQL het inmiddels ondersteunt, maar waarom niet zoiets?
code:
1
2
3
4
5
6
7
8
9
10
echte_tabel
-----------
id
korte_waarde


myisam_tabel
---------------
id
lange_varchar

Elke query die je vervolgens doet, waarbij je die varchar nodig hebt, kan je de 2 tabellen op elkaar joinen. Met MySQL 5.1 kan je zelfs een VIEW maken, waardoor het werkt alsof het 1 tabel is :)

Verwijderd

Topicstarter
InnoDB is gekozen vanwege row locking in plaats van table locking.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

hmm, dan heb je aan mijn idee niet echt veel. Ik dacht performance ofzo, heb me nooit echt verdiept in de verschillen tussen InnoDB en MyIsam. Welke heb ik eigenlijk? ;) *schaam*

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke, het maken e.d. van table met fulltext is gelukt, wat ik me nu echter afvraag is hoe ik de table het best up to date houdt rekening houdend met de load.
Een keer per dag updaten lijkt mij genoeg, dus er zijn een aantal opties:
  1. Elke nacht table droppen en opnieuw helemaal creëren.
  2. Elke update op insert op beide uitvoeren
  3. Bijhouden welke rows in de tabel zijn aangepast sinds de vorige dag en alleen die updaten in MyISAM
Welke lijkt jullie het minst belastend?

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Zit je niet met je integriteit als je die zooi alleen 's nachts laat uitvoeren?
Ik zou een testje uitvoeren:
1. schrappen, dat wordt zoieso niks. In dat geval lijkt me een join op de 2 tabellen handiger, en dan replace doen als er een verschil is. Volgens mij kan dat in 1 query, maar joins enzo moet ik weer even opzoeken :)
2. Welk voordeel heb je dan nog uit je keuze voor InnoDB?
3. Misschien wel de simpelste: gewoon een TIMESTAMP kolommetje toevoegen, en alles van minder dan X uur oud updaten

4. triggers etc met MySQL 5?
Pagina: 1