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

1271

    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. Mies, mitä minun pitäisi tehdä

      Niin, mitä naisen siis pitäisi tehdä, että lähestyisit ja tekisit aloitteen? Mikä on riittävä kiinnostuksen osoitus juur
      Ikävä
      180
      2230
    2. Miksi teillä meni...

      ...välit poikki kaivattusi kanssa?
      Ikävä
      175
      1851
    3. Toivottavasti et mussukka elättele toiveita meikäläisen suhteen

      Tiedän mitä olet touhunnut joten aivan turha haaveilla mistään enää 👍
      Ikävä
      170
      1722
    4. Sofia Virralla ja Minja Koskelalla ei mitään käsitystä terveyskeskusmaksuista!

      Vasemmistopimut Sofia ja Minja täysin ulkona sote asioista, ei minkäänlaista käsitystä edes mittaluokasta, missä terveys
      Maailman menoa
      110
      1538
    5. Summit-tippuja Nicola sai Carolalta yllättävän viestin - Some älähtää rajusti: "Älä viitsi..."

      The Summit Suomi -kisa käy kuumana kylmässä Norjan vuoristossa. Nicola tiputettiin kisasta juuri ennen finaalia. Likaise
      Tv-sarjat
      26
      1494
    6. Nainen näytät mummolta. :D

      Siks sua ei huoli kukaan.
      Ikävä
      109
      1250
    7. Juusolle sataa vihaisia viestejä hoitajilta ja loput nauravat hänelle

      Ei löydy montaakaan, joka kehuisi Juuson toimintaa ministerinä: "Selvä enemmistö Juuson päivitykseen reagoineista on su
      Perussuomalaiset
      167
      1114
    8. Persuehdokas uhkasi tappaa "jätkän" ja ravintolayrittäjän

      Kuuntele tästä kuinka meuhkaa. https://www.iltalehti.fi/politiikka/a/4eb3034d-48c5-4f31-b53c-42be3dc9607c
      Perussuomalaiset
      77
      1073
    9. Varattais lähihotellista

      🥰 huone viikoksi. Oltais vaan ja tilattais huonepalvelusta herkkuja! Viikonloppukin käy jos et viikoksi ehdi ❤ Hyvää
      Ikävä
      148
      962
    10. Kompostointitarkastaja tuli tarkastukselle!

      En ole ikinä kompostoinnut ja eilen kävi kompostointitarkastaja kylässä. Tosi hianoa byrokratiaa taas: "Laki edellyttää,
      58
      955
    Aihe