Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: SQL: mysql ongelma

suski78 [25.07.2004 17:51:26]

#

Heip, osaisiko kukaan auttaa seuraavassa herjassa:

"Warning: mysql_query(): Your query requires a full tablescan (table taulun_nimi, 7 rows affected.) Use EXPLAIN to optimize your query. in tiedosto.php on line 167
"

En ole tehnyt mitään muutoksia asetuksiin, ja kanta on toiminut moitteettomasti tähän asti. Herja tulee kaikilla sivuilla, joissa on yhteys tietokantaan, joten ongelma tuskin lienee siinä, että hakuni olisivat huonosti optimoituja :(.

mike patto [27.07.2004 11:33:47]

#

Siinä se vika kuitenkin on, full tablescan eli koko taulun läpiluku on nimenomaan merkki huonosti optimoidusta sql:stä. Sillä että saat yhteyden kantaan ei sinänsä kerro mitään sql:n tasossta (connectia lukuunottamatta)

suski78 [28.07.2004 12:39:44]

#

Hmm, silti minusta tuntuu, että tuo herja on hieman "koominen", jos taulussani on esim. 7 riviä, joiden läpikäyminen ei kuitenkaan ole vielä raskasta ja jos joka tapauksessa haluan, että ne kaikki rivit käydään läpi.

Esim. minulla on sovellus, jossa voi antaa hakuehtoja ja jos nämä hakuehdot sitten matsaavat kaikkiin niihin 7 riviin, niin silloihan kuuluukin tehdä full scan ja silloin en haluaisi tuota herjaa.

Saahan ne php:n warningit pois päältäkin, mutta silloin voi mennä jotain tärkeämpiäkin warningeja ohi :(.

mike patto [28.07.2004 12:49:12]

#

Tuntematta tarkemmin mysql:n sielunelämää, tuntuu tosiaan aika koomiselta herjalta, Ehkä 'Use EXPLAIN to optimize your query' ehdotus auttaa optimoijaa. Voihan olla että se ei herjaa kun laitat kannan statistiikan kohdalleen, ilman niitä ei yleensä mikään optimoija voi toimia oikein. Eli systeemitauluista löytyy optimoijalle vinkit taulujen ja indeksien rivimääristä ja kenttien eriarvojen lukumääristä (plus kaikenlaista muuta sälää)

FooBat [21.08.2004 00:36:08]

#

En ole tuollaista virhettä koskaan kohdannut, mutta kuvittelisin että syy on joko:
1)
Haet useasta taulusta etkä määrittele taulujen aliaksia
SELECT A.NIMI, B.NIMI FROM TAULU1 A, TAULU2 B
2)
Haet tietoa kentän perusteella, joka ei ole indeksöity.
3)
Taulusta puuttuu primary key

CREATE TABLE FOOBAR (
   ID     INTERGER,
   FOO    VARCHAR(16),
   PRIMARY KEY(ID)
);

CREATE INDEX FOO_INDEX ON FOOBAR (FOO);

tai jotenkin noin :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta