Indexin luominen (mysql)

jarkko-the-chocoholic

Olen saanut kuulla, että nettisivumme toimivat tietyissä tilanteissa erittäin hitaasti siistä syystä, että joihinkin tietokantatauluihin ei ole tehty indeksejä. Minä en tietokannnan rakenteista ja indekseistä ymmärrä paljoakaan, mutta katsastin sivun http://www.ohjelmointiputka.net/opas.php?tunnus=mysqlphp10#indeksit ja jos tuota ihan maallikkona lukee (siis tuo osuus indexeistä), niin tuohan vaikuttaa varsin yksinkertaiselta.

Onko siis totta, että indexin luominen vaatii ainoastaan tuollaisen CREATE INDEX sql-lauseen ajamisen? Eikö todellakaan mihinkään muualle tarvi tehdä mitään kun kyseiseen taullun luoda em. tavalla indexi? Tuo tuntuu jotenkin liian yksinkertaiselta, mutta kuten sanoin, en ymmärrä tästä asiasta juurikaan mitään.

No JOS se indexin luominen olisi noin yksinkertaista, niin mitä tuossa esimerkkisivun esimerkkilauseessa

CREATE INDEX omaindeksi ON tuotteet (hinta);

tulee tuon "omaindeksi" sanan tilalle. Saako sen itse päättää vapaasti?

9

1304

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • juhakorkeapudas

      Ei se muuta vaadi. Jos kanta ei ole sinun tekemäsi, mistä tiedät, että indeksiä ei ole? Palveluntarjoajalla on varmasti työkalu kannan selaamisen (phpmyadmin). Katsopa sen kautta onko indeksi olemassa ja ellei ole luo se samalla työkalulla tai sitten ihan mysql komentoriviltä kuten esimerkissä.
      Indeksin nimen (omaindeksi) voi valita itse mutta taulu (tuotteet) ja kenttä (hinta) pitää olla olemassa.

      • jarkko-the-chocoholic

        "Jos kanta ei ole sinun tekemäsi, mistä tiedät, että indeksiä ei ole?"

        Webhotellin ylläpidosta sanottiin niin:

        "Palvelunne kuormittaa tällä hetkellä hyvin vahvasti palvelinta ja syynä on indeksien puuttuminen. Esimerkiksi alla olevalle haulle ei ole sopivia indeksejä suklaa_product_eval ja suklaa_public_eval tauluissa. Koska näistä kahdesta taulusta puuttuvat sopivat indeksit mysql käsittelee joka kerta 8022*5651 riviä (noin 45 miljoonaa riviä).

        SELECT tuote.id, producer_id, product_name, product_info, image_name,
        big_image_name, producer.name AS producer, country.name AS country, AVG(
        eval.rank ) AS eval_avg, COUNT( DISTINCT eval.id ) AS eval_count, AVG(
        publ.rank ) AS publ_avg, COUNT( DISTINCT publ.id ) AS publ_count
        FROM suklaa_product AS tuote
        INNER JOIN suklaa_producer AS producer ON producer.id = tuote.producer_id
        INNER JOIN suklaa_product_eval AS eval ON eval.product_id = tuote.id
        INNER JOIN suklaa_country AS country ON country.id = tuote.country_id
        LEFT JOIN suklaa_public_eval AS publ ON publ.product_id = tuote.id
        WHERE producer_id =18
        AND show_in_web =1
        GROUP BY tuote.id, product_name, image_name, product_info
        ORDER BY product_name ASC
        "

        Tietokannassa on tietenkin muitakin tauluja kuin nuo 2 mainittua, yhteensä 15. Otin mainituista tauluista kuvankaappaukset phpmyadminista ja minusta näyttäisi että jotain indeksejä on, mutta en mää tuosta oikeen tajua...

        http://www.suklaayhdistys.com/jutut/suklaa_product_eval.jpg
        http://www.suklaayhdistys.com/jutut/suklaa_public_eval.jpg


      • juhakorkeapudas
        jarkko-the-chocoholic kirjoitti:

        "Jos kanta ei ole sinun tekemäsi, mistä tiedät, että indeksiä ei ole?"

        Webhotellin ylläpidosta sanottiin niin:

        "Palvelunne kuormittaa tällä hetkellä hyvin vahvasti palvelinta ja syynä on indeksien puuttuminen. Esimerkiksi alla olevalle haulle ei ole sopivia indeksejä suklaa_product_eval ja suklaa_public_eval tauluissa. Koska näistä kahdesta taulusta puuttuvat sopivat indeksit mysql käsittelee joka kerta 8022*5651 riviä (noin 45 miljoonaa riviä).

        SELECT tuote.id, producer_id, product_name, product_info, image_name,
        big_image_name, producer.name AS producer, country.name AS country, AVG(
        eval.rank ) AS eval_avg, COUNT( DISTINCT eval.id ) AS eval_count, AVG(
        publ.rank ) AS publ_avg, COUNT( DISTINCT publ.id ) AS publ_count
        FROM suklaa_product AS tuote
        INNER JOIN suklaa_producer AS producer ON producer.id = tuote.producer_id
        INNER JOIN suklaa_product_eval AS eval ON eval.product_id = tuote.id
        INNER JOIN suklaa_country AS country ON country.id = tuote.country_id
        LEFT JOIN suklaa_public_eval AS publ ON publ.product_id = tuote.id
        WHERE producer_id =18
        AND show_in_web =1
        GROUP BY tuote.id, product_name, image_name, product_info
        ORDER BY product_name ASC
        "

        Tietokannassa on tietenkin muitakin tauluja kuin nuo 2 mainittua, yhteensä 15. Otin mainituista tauluista kuvankaappaukset phpmyadminista ja minusta näyttäisi että jotain indeksejä on, mutta en mää tuosta oikeen tajua...

        http://www.suklaayhdistys.com/jutut/suklaa_product_eval.jpg
        http://www.suklaayhdistys.com/jutut/suklaa_public_eval.jpg

        Tuo oletusindeksi näyttää olevan mutta sen lisäksi voit määritellä uuden indeksin kohdassa Indeksit: Luo 1:n sarakkeen indeksi -> Siirry. Tämän jälkeen annat indeksille nimen ja määrittelet sarakkeen josta indeksi muodostetaan. Kenttiä voi myös lisätä (max 16) samaan indeksiin jos kenttien sisältö on sen tyyppistä, että niitä käytetään yhdessä (http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html).


      • jarkko-the-chocoholic
        juhakorkeapudas kirjoitti:

        Tuo oletusindeksi näyttää olevan mutta sen lisäksi voit määritellä uuden indeksin kohdassa Indeksit: Luo 1:n sarakkeen indeksi -> Siirry. Tämän jälkeen annat indeksille nimen ja määrittelet sarakkeen josta indeksi muodostetaan. Kenttiä voi myös lisätä (max 16) samaan indeksiin jos kenttien sisältö on sen tyyppistä, että niitä käytetään yhdessä (http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html).

        Ei riitä ymmärrys...

        "määrittelet sarakkeen josta indeksi muodostetaan"

        Mistä tiedän mikä sarake olisi oikea valinta? Kokeilin valita sarakkeen "product_id", joka ilmeisimmin on kunkin tuotteen erillinen id, mutta siitä seurasi vaan herjaa mahdollisesti johtuen siitä, että sama "product_id" esiintyy taulussa suklaa_product_eval monta kertaa, sillä samasta tuotteesta voi olla monta arviotakin.

        Tietenkin tuossa olisi käytettävissä myös sarake "id", joka esiintyy monessakin taulussa, mutta numero 1 siinä sarakkeessa ei taida aina tarkoittaa samaa asiaa eri taulujen välillä.

        Aika arka olo mennä käpistelemään noita kun ei ymmärrä. Onneksi sentään on testikanta omalla servolla jossa voi kokeilla, ei ole niin vaarallista jos menee kurttuun :-) Ei sua tietenkään sais esimerkiksi suklaalla houkuteltua laittamaan indeksit kuntoon?


      • juhakorkeapudas
        jarkko-the-chocoholic kirjoitti:

        Ei riitä ymmärrys...

        "määrittelet sarakkeen josta indeksi muodostetaan"

        Mistä tiedän mikä sarake olisi oikea valinta? Kokeilin valita sarakkeen "product_id", joka ilmeisimmin on kunkin tuotteen erillinen id, mutta siitä seurasi vaan herjaa mahdollisesti johtuen siitä, että sama "product_id" esiintyy taulussa suklaa_product_eval monta kertaa, sillä samasta tuotteesta voi olla monta arviotakin.

        Tietenkin tuossa olisi käytettävissä myös sarake "id", joka esiintyy monessakin taulussa, mutta numero 1 siinä sarakkeessa ei taida aina tarkoittaa samaa asiaa eri taulujen välillä.

        Aika arka olo mennä käpistelemään noita kun ei ymmärrä. Onneksi sentään on testikanta omalla servolla jossa voi kokeilla, ei ole niin vaarallista jos menee kurttuun :-) Ei sua tietenkään sais esimerkiksi suklaalla houkuteltua laittamaan indeksit kuntoon?

        Laitapa ensin taulun suklaa_product indeksit kuntoon. Tee indeksi näille sarakkeille: "tuote.id, producer_id, product_name, product_info, image_name, producer.name, country.name". Samaan syssyyn katso myös muut taulut ja tee niille myös indeksit samaan tyyliin.

        Sen jälkeen testaa vaikuttiko indeksin luonti hakuun. Veikkaisin, että ongelman ydin on juuri tuossa suklaa_product taulussa ellei siellä ole indeksejä. En ole törmännyt virheeseen indeksiä luodessa mutta olen tehnyt niitä yleensä vain sarakkeisiin joiden arvot ovat yksilöllisiä.


      • juhakorkeapudas
        jarkko-the-chocoholic kirjoitti:

        Ei riitä ymmärrys...

        "määrittelet sarakkeen josta indeksi muodostetaan"

        Mistä tiedän mikä sarake olisi oikea valinta? Kokeilin valita sarakkeen "product_id", joka ilmeisimmin on kunkin tuotteen erillinen id, mutta siitä seurasi vaan herjaa mahdollisesti johtuen siitä, että sama "product_id" esiintyy taulussa suklaa_product_eval monta kertaa, sillä samasta tuotteesta voi olla monta arviotakin.

        Tietenkin tuossa olisi käytettävissä myös sarake "id", joka esiintyy monessakin taulussa, mutta numero 1 siinä sarakkeessa ei taida aina tarkoittaa samaa asiaa eri taulujen välillä.

        Aika arka olo mennä käpistelemään noita kun ei ymmärrä. Onneksi sentään on testikanta omalla servolla jossa voi kokeilla, ei ole niin vaarallista jos menee kurttuun :-) Ei sua tietenkään sais esimerkiksi suklaalla houkuteltua laittamaan indeksit kuntoon?

        "Samaan syssyyn katso myös muut taulut ja tee niille myös indeksit samaan tyyliin."

        Siis siinä tapauksessa, jos muitakin tauluja käytetään nettihauissa.


      • jarkko-the-chocoholic
        juhakorkeapudas kirjoitti:

        Laitapa ensin taulun suklaa_product indeksit kuntoon. Tee indeksi näille sarakkeille: "tuote.id, producer_id, product_name, product_info, image_name, producer.name, country.name". Samaan syssyyn katso myös muut taulut ja tee niille myös indeksit samaan tyyliin.

        Sen jälkeen testaa vaikuttiko indeksin luonti hakuun. Veikkaisin, että ongelman ydin on juuri tuossa suklaa_product taulussa ellei siellä ole indeksejä. En ole törmännyt virheeseen indeksiä luodessa mutta olen tehnyt niitä yleensä vain sarakkeisiin joiden arvot ovat yksilöllisiä.

        Arvasinhan minä, että ei tämä ihan näin yksinkertaista ole ;-\

        Tällaisia sarakkeita ei ole olemassakaan (missään taulussa):
        tuote.id
        producer.name
        country.name

        Lisäksi (tiedoksi, jos vaikuttaa johonkin):
        - producer_id -sarakkeessa on monissakin sama numero, eli valmistajan ID, joka on määritelty suklaa_producer -taulun id-sarakkeessa (eli odotettavissa kenties aiemmin saamani herja)
        - product_info -sarake on tyhjä (turha sarake periaatteessa)
        - image_name -sarake sisältää vain http://www... -polun kuvatiedostoon

        Ja varmistuksena vielä:
        Jos haluan tehdä indeksin sarakkeelle product_name niin painan sitä "Luo 1:n sarakkeen indeksi" ja Siirry. Sitten annan indeksille keksimäni nimen ja valitsen sarakkeeksi product_name. Näinkö? Pitääkö indeksin olla primary, index, unique (oletus) vai fulltext? Tarvitseeko koko-kenttään merkitä mitään?


      • juhakorkeapudas
        jarkko-the-chocoholic kirjoitti:

        Arvasinhan minä, että ei tämä ihan näin yksinkertaista ole ;-\

        Tällaisia sarakkeita ei ole olemassakaan (missään taulussa):
        tuote.id
        producer.name
        country.name

        Lisäksi (tiedoksi, jos vaikuttaa johonkin):
        - producer_id -sarakkeessa on monissakin sama numero, eli valmistajan ID, joka on määritelty suklaa_producer -taulun id-sarakkeessa (eli odotettavissa kenties aiemmin saamani herja)
        - product_info -sarake on tyhjä (turha sarake periaatteessa)
        - image_name -sarake sisältää vain http://www... -polun kuvatiedostoon

        Ja varmistuksena vielä:
        Jos haluan tehdä indeksin sarakkeelle product_name niin painan sitä "Luo 1:n sarakkeen indeksi" ja Siirry. Sitten annan indeksille keksimäni nimen ja valitsen sarakkeeksi product_name. Näinkö? Pitääkö indeksin olla primary, index, unique (oletus) vai fulltext? Tarvitseeko koko-kenttään merkitä mitään?

        Sori, tarkoitin, että käy läpi muut taulut joita käytetään antamissasi kyselyissä ja määrittele indeksit niiden sarakkeisiin. Hidastumista tulee kun tuossa yhdistämiskyselyssä käytetään useampaa taulua ja jos niiden indeksointi ei ole kunnossa haku kestää kauan.

        "Ja varmistuksena vielä:"
        Kyllä, juuri niin. Indeksin tyyppi tulee olla index paitsi niissä kentissä joissa on esim. tuotteen kuvaus tms. muu pitkä teksti ja haluat, että ko. sarakkeen sisältö on indeksoitu kokonaan (tämä kasvattaa myös indeksin kokoa).

        Laita mahdolliset virheilmoitukset esille.


      • näillä kokeilemaan
        jarkko-the-chocoholic kirjoitti:

        "Jos kanta ei ole sinun tekemäsi, mistä tiedät, että indeksiä ei ole?"

        Webhotellin ylläpidosta sanottiin niin:

        "Palvelunne kuormittaa tällä hetkellä hyvin vahvasti palvelinta ja syynä on indeksien puuttuminen. Esimerkiksi alla olevalle haulle ei ole sopivia indeksejä suklaa_product_eval ja suklaa_public_eval tauluissa. Koska näistä kahdesta taulusta puuttuvat sopivat indeksit mysql käsittelee joka kerta 8022*5651 riviä (noin 45 miljoonaa riviä).

        SELECT tuote.id, producer_id, product_name, product_info, image_name,
        big_image_name, producer.name AS producer, country.name AS country, AVG(
        eval.rank ) AS eval_avg, COUNT( DISTINCT eval.id ) AS eval_count, AVG(
        publ.rank ) AS publ_avg, COUNT( DISTINCT publ.id ) AS publ_count
        FROM suklaa_product AS tuote
        INNER JOIN suklaa_producer AS producer ON producer.id = tuote.producer_id
        INNER JOIN suklaa_product_eval AS eval ON eval.product_id = tuote.id
        INNER JOIN suklaa_country AS country ON country.id = tuote.country_id
        LEFT JOIN suklaa_public_eval AS publ ON publ.product_id = tuote.id
        WHERE producer_id =18
        AND show_in_web =1
        GROUP BY tuote.id, product_name, image_name, product_info
        ORDER BY product_name ASC
        "

        Tietokannassa on tietenkin muitakin tauluja kuin nuo 2 mainittua, yhteensä 15. Otin mainituista tauluista kuvankaappaukset phpmyadminista ja minusta näyttäisi että jotain indeksejä on, mutta en mää tuosta oikeen tajua...

        http://www.suklaayhdistys.com/jutut/suklaa_product_eval.jpg
        http://www.suklaayhdistys.com/jutut/suklaa_public_eval.jpg

        CREATE INDEX suklaa_product_producer ON sulkaa_product (producer_id)
        CREATE INDEX suklaa_product_sorter ON suklaa_product (Id, product_name, image_name, product_info)
        CREATE INDEX suklaa_product_name ON sulkaa_product (product_name)

        Tietysti indeksin voi sitten nimetä toisinkin tuo nyt on vaan mun tapa.
        Kyselystä arvelisin että suklaa_producer ja suklee_country käyttäisi varmaankin primary avainta joten niihin ei tuon kyselyn takia tarvinne indexsejä luoda.

        Ja muistaa jättää uniqu määreet pois niin eipä haittaa tuplat indeksissä.
        En nyt muista miten MySql mutta monissa kannoissa on myös mahdollista kysyä mitä indeksejä kanta kyselyssä käyttää.
        solidissa kirjoitetaan kyselun eteen "explain plan for" ja sitten kysely mutta MySql:ssä ei varmaankaan ole samalla nimellä.

        Ja tuo on muutenkin ihan hatusta revästy mutta koita, jos haluat ja jos koitat niin toivottavasti auttaa.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Hyvää syntymäpäivää Sanna 40 vee!!!!

      ᕼᗩᑭᑭY ᗷIᖇTᕼᗞᗩY Sister ❣️🥰 🎉🎂✨🍰🥳 🥳🎂🥂 🎉🎊🎁🎈🎂
      Maailman menoa
      138
      5828
    2. Mikä on vaikeinta siinä, että menetti yhteyden kaivattuun, jota vielä ajattelee?

      Mikä jäi kaihertamaan? Jos jokin olisi voinut mennä toisin, mitä se olisi ollut? Mitä olisit toivonut vielä ehtiväsi san
      Ikävä
      397
      2632
    3. Kerro kaivattusi etunimi

      Miehille..
      Ikävä
      136
      2584
    4. Persut rahoittavat velkarahalla rikkaiden ökyelämää

      Minkä vuoksi persut eivät leikkaa rikkailta, joilla on maksukykyä? Tuskinpa tuo persujen käytös saa Suomen kansalta hyv
      Maailman menoa
      10
      2100
    5. Onhan tää tyhmää ajatella sua kun tuskin ees muistat mua

      Hyvää yötä sinne jonnekin. 💔
      Ikävä
      14
      1660
    6. Kerro kaivattusi etunimi

      Naisille
      Ikävä
      71
      1249
    7. Veronmaksajat kustantavat yrittäjien eläkkeitä jo yli 500 miljoonalla

      Suomalaista yrittäjää ei kommunistista erota. Aktiivisen "yrittämisen" maksattaa yritystukina yhteiskunnalla, ja vieläpä
      Yrittäjyys
      4
      1094
    8. Kun ei numeroa

      niin en edes voi viestittää, et suunnitelmiin tuli muutos. Ikävä on, ja kasvaa vaan🤍
      Ikävä
      10
      1072
    9. Mikä musta tekee

      Oikein haluttavan sun silmissä? Mä en ymmärrä. Parasta aika mennyt ko ohi 😃
      Ikävä
      52
      948
    10. Millainen on

      Ihanne kumppani
      Ikävä
      83
      878
    Aihe