[SQL] Rare SQL error

Pagina: 1
Acties:

  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
PHP:
1
2
3
4
SELECT a.member_id, a.forum_id, a.file_name, a.file_size, 
                           p.attach_id, p.pid, p.topic_id, t.title, f.name, p.post_date 
                    FROM ibf_attachments a, ibf_posts p, ibf_topics t, ibf_forums f 
                    WHERE a.file_name=p.attach_id AND p.topic_id=t.tid AND a.forum_id=f.id AND a.member_id = '". $IN['member_id'] ."'


Ik krijg deze error:
code:
1
2
mySQL error: The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok
mySQL error code: 1104


er komen maximaal ong. 20 rows uit echt raar..

Er lijkt mij niets verkeerts aan deze query.

er staat ook iets over SQL_BIG_SELECTS maar moet ik dat in de query neerzetten of heeft dit met de server config te maken?

www.dannyhiemstra.nl


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Doe eens een explain?
code:
1
2
3
4
EXPLAIN SELECT a.member_id, a.forum_id, a.file_name, a.file_size, 
                           p.attach_id, p.pid, p.topic_id, t.title, f.name, p.post_date 
                    FROM ibf_attachments a, ibf_posts p, ibf_topics t, ibf_forums f 
                    WHERE a.file_name=p.attach_id AND p.topic_id=t.tid AND a.forum_id=f.id AND a.member_id = '". $IN['member_id'] ."'

Localhost, sweet localhost


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:50

gorgi_19

Kruimeltjes zijn weer op :9

kvdveer: Zullen joins in dit geval ook niet een heel stuk helpen?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
code:
1
2
3
4
5
table  type  possible_keys  key  key_len  ref  rows  Extra  
a ALL NULL NULL NULL NULL 379 where used 
p ALL topic_id NULL NULL NULL 14350 where used 
t eq_ref PRIMARY PRIMARY 8 p.topic_id 1   
f eq_ref PRIMARY PRIMARY 2 a.forum_id 1 where used


wat ik hieruit begrijp is dat die 14350 rows pakt uit 'p'

doe ik iets fout in de WHERE dan? maar wat?

[ Voor 17% gewijzigd door chuxiej op 09-02-2003 15:36 ]

www.dannyhiemstra.nl


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

gorgi_19 schreef op 09 February 2003 @ 15:28:
kvdveer: Zullen joins in dit geval ook niet een heel stuk helpen?
Hij gebruik al joins, hij selecteert namelijk uit meerdere tabellen. Ik denk dat indices meer uit zullen maken, maar laten we daarvoor even die explain afwachten.

Localhost, sweet localhost


  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 18:21

Tux

FireFoxx: Het is voor ons handiger als je je query een beetje overzichtelijk hier neerzet :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
 a.member_id, 
 a.forum_id, 
 a.file_name, 
 a.file_size,  
 p.attach_id, 
 p.pid, 
 p.topic_id, 
 t.title, 
 f.name, 
 p.post_date  
FROM 
 ibf_attachments a, 
 ibf_posts p, 
 ibf_topics t, 
 ibf_forums f  
WHERE 
 a.file_name = p.attach_id 
AND 
 p.topic_id = t.tid 
AND 
 a.forum_id = f.id
AND
 a.member_id = '" . $IN['member_id'] . "'


Dit ziet er bijv. een stuk overzichtelijker uit ;)

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

code:
1
2
3
4
5
table type     possible_keys  key      key_len  ref      rows  Extra  
a     ALL      NULL           NULL     NULL     NULL     379   where used 
p     ALL      topic_id       NULL     NULL     NULL     14350 where used 
t     eq_ref   PRIMARY        PRIMARY  8        p.topic_id 1   
f     eq_ref   PRIMARY        PRIMARY  2        a.forum_id 1   where used


Zoals je wellicht ziet, is die tweede rij de boosdoener. Die doet een full-table scan op 14k rows. Waarschijnlijk moet je in tabel p een index plaatsen, waarschijnlijk op het veld topic_id.
Een alternatief is om je query te splitsen, of je tabelstructuur aan te passen.
Tot slot kun je die warning uitzetten met SQL_BIG_SELECTS=1, maar die warning wordt niet zonder reden gegeven natuurlijk. ;-)

Localhost, sweet localhost

Pagina: 1