[php/mysql] search query/Wat is efficienter: OR of IN*

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hay mensen ik ben nu druk bezig met een search engine voor me hash(es) site maar kom ergens ff niet uit :{

ik heb 3 search mogelijkheden die de user tegelijk kan benutten

1. op keywoorden (meerdere)
(AND)
2. in welke tree(all, movies, apps, apps/windows, etc)
(AND)
3. welke client

nu heb ik bv een query als dit

code:
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
SELECT 
    sd_item.id, 
    sd_item.clicks, 
    sd_item.vote, 
    sd_item.title, 
    count(sd_hash.id) as files, 
    sum(sd_hash.size) as totalsize, 
    sum(sd_hash.views) as dls 
FROM 
    sd_item 
LEFT JOIN 
    sd_hash ON sd_hash.item_id = sd_item.id 
WHERE 
    sd_item.comment LIKE '%die%' 
OR 
    sd_item.title LIKE '%die%' 
OR 
    sd_hash.file LIKE '%die%' 
AND 
    sd_item.tree_id='5'  
OR 
    sd_item.tree_id='10' 
OR 
    sd_item.tree_id='6' 
OR 
    sd_item.tree_id='9' 
OR 
    sd_item.tree_id='8' 
OR 
    sd_item.tree_id='30' 
OR 
    sd_item.tree_id='31' 
OR 
    sd_item.tree_id='32' 
OR 
    sd_item.tree_id='33' 
OR 
    sd_item.tree_id='34' 
OR 
    sd_item.tree_id='35' 
OR 
    sd_item.tree_id='36' 
OR 
    sd_item.tree_id='37' 
OR 
    sd_item.tree_id='38' 
OR 
    sd_item.tree_id='39' 
OR 
    sd_item.tree_id='40' 
OR 
    sd_item.tree_id='41' 
OR 
    sd_item.tree_id='42' 
OR 
    sd_item.tree_id='43' 
OR 
    sd_item.tree_id='44' 
GROUP BY 
    sd_item.id 
ORDER BY 
    sd_item.id 
DESC LIMIT 0,25


nu krijg ik 3 uitkomsten terwijl er maar 1 mogelijk is, alleen in tree_id 30 staat de link die verwijst naar die another day (voorbeeld)

nu zien jullie wel dat dit nogal een complexe query is :D heeft iemand suggesties om dit beter op te pakken, in de meeste gevallen komt er ook maar 1 sd_item.tree_id staan omdat men dan in een bv catagorie zoekt ala movies > action of games > rpg..

[ Voor 9% gewijzigd door Verwijderd op 30-12-2002 22:44 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
je moet alleszins haakjes gebruiken:

code:
1
WHERE (title like 'die%' or comment like 'die%') AND (item_tree = 5 or item_tree = 6)

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Er is niks complex aan. 't Is lang dat is alles. Zoals je zelf al aangeeft moet je de where clause in 3 delen opsplitsen:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT
   # ...
FROM
   # ...
WHERE
   (voorwaarde 1)
   AND
   (voorwaarde 2)
   AND
   (voorwaarde 3)

daar waar voorwaarde 1, 2 en 3 ook weer uit meerdere voorwaarden kunnen bestaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
WHERE (
     voorwaarde 1.1
   OR 
     voorwaarde 1.2
   OR 
     voorwaarde 1.3
   )
AND (
      voorwaarde 2.1
   AND
      voorwaarde 2.2
)

etcetera.

't is toch echt gewoon heel eenvoudige basic logica, dat je haakjes moet gebruiken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op 30 December 2002 @ 22:50:
je moet alleszins haakjes gebruiken:

code:
1
WHERE (title like 'die%' or comment like 'die%') AND (item_tree = 5 or item_tree = 6)
dat is inderdaad het geval, had ff snel me query getest maar werkt idd op deze manier veel beter :D
drm schreef op 30 December 2002 @ 22:52:
Er is niks complex aan. 't Is lang dat is alles. Zoals je zelf al aangeeft moet je de where clause in 3 delen opsplitsen:

't is toch echt gewoon heel eenvoudige basic logica, dat je haakjes moet gebruiken.
Inderdaad dat is iets waar ik na het antwoord van whoami achter kwam |:(

[ Voor 38% gewijzigd door Verwijderd op 30-12-2002 22:55 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Overigens is het niet onverstandig om een IN() te gebruiken als je 1 veld op meerdere waarden checkt. Ik weet niet of het geoptimaliseerd wordt, maar ik heb zo'n vermoeden dat IN sneller is dan ( ... OR ... OR ... OR ... )

code:
1
2
SELECT
   1 IN (1,2,3,4,5);


Verder http://www.mysql.com/doc/

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Verwijderd schreef op 30 December 2002 @ 22:54:
Inderdaad dat is iets waar ik na het antwoord van whoami achter kwam |:(


Je hoeft je hoofd niet te stoten hoor. drm was z'n reply misschien nog aan het typen toen ik net de mijne postte.

Ik weet niet of die IN sneller is dan ( .... OR .... OR ... ), maar het is alleszins duidelijker.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Laat ik het zo zeggen: Ik kan geen reden bedenken waarom IN niet sneller zou zijn dan OR :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

whoami schreef op 30 December 2002 @ 23:01:
Ik weet niet of die IN sneller is dan ( .... OR .... OR ... ), maar het is alleszins duidelijker.
Voor MySQL kan ik het niet zeggen, maar voor Oracle wordt een statische IN omgezet naar OR's in de query parsing.

Who is John Galt?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, ik zie dat het topic weer open is: mag ik wederom een vraag stellen, denken jullie dat het mogelijk is om ook de query's voor

sd_item.title, sd_item.comment en sd_hash.file te verbeteren?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Verwijderd schreef op 30 December 2002 @ 23:07:
ok, ik zie dat het topic weer open is: mag ik wederom een vraag stellen, denken jullie dat het mogelijk is om ook de query's voor

sd_item.title, sd_item.comment en sd_hash.file te verbeteren?


Hoe bedoel je?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

xtentic Je zou naar FULLTEXT indices kunnen kijken. Zie wederom http://www.mysql.com

De reden dat dit topic weer open is gegaan is omdat er even duidelijkheid geschept ging worden door een onbekend iemand over of de IN of de OR oplossing het snelst is. 't Is dus geen vrijbrief om door te gaan met vragen die je zelf op kunt lossen/nazoeken.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
[nohtml]
drm schreef op 30 December 2002 @ 23:09:

De reden dat dit topic weer open is gegaan is omdat er even duidelijkheid geschept ging worden door een onbekend iemand over of de IN of de OR oplossing het snelst is.
Althans, dat hopen we. :+

Als het in Oracle omgezet wordt naar OR's , dan zal het daar dus niet sneller zijn.
Ik heb net ff op sql-server-performance.com en in m'n boek ('SQL Server Performance Tuning) gekeken, maar ik heb daar niet zo snel iets kunnen over vinden.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

De vraag is natuurlijk of het in Oracle in de syntax tree omgezet wordt naar OR's, of later pas. Dat maakt nog wel verschil.

edit:

Ik bedoel: Als er dit gebeurt:

code:
1
2
SELECT
   sjaak IN ('w00t','spef')

en dit wordt eerst omgezet in
code:
1
2
SELECT
   sjaak = 'w00t' OR sjaak = 'spef'

voordat het daadwerkelijk geparsed wordt, dan is het natuurlijk langzamer, maar als het erop neerkomt dat ze beiden geparsed worden naar een
code:
1
2
3
4
<or>
   <sjaak equals 'w00t'>
   <sjaak equals 'spef'>
</or>
in de syntax tree, dan maakt het natuurlijk niets uit.

[ Voor 66% gewijzigd door drm op 30-12-2002 23:15 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik denk dat drm al reeds dat antwoord heeft gegeven, ik moet dus waar schijnlijk velden matchen als in WHERE MATCH (title,body) AGAINST ('database');
drm schreef op 30 december 2002 @ 23:09:
xtentic Je zou naar FULLTEXT indices kunnen kijken. Zie wederom http://www.mysql.com

De reden dat dit topic weer open is gegaan is omdat er even duidelijkheid geschept ging worden door een onbekend iemand over of de IN of de OR oplossing het snelst is. 't Is dus geen vrijbrief om door te gaan met vragen die je zelf op kunt lossen/nazoeken.
Ik ben bezig... en ga verder zoeken..

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
titel even bijgewerkt. :Y)

https://fgheysels.github.io/

Pagina: 1