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

1239

    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. Moi vaan vielä kerran

      Kivaa päivää samalla. Kukaan ei kaipaa eikä rakasta. 💔🐺🌃🌧️☀️
      Ikävä
      348
      4634
    2. Naiselle varatulle

      Jos homma kariutuu kotona, niin saanko sinut ihan omakseni🙂??
      Tunteet
      30
      2912
    3. Naisiin ei ole luottamista

      Ainakaan useimpiin suurin osa hakee vain hyötyä miehistä tavalla tai toisella.
      Ikävä
      95
      1979
    4. Herätys nyt vittu!

      Laihduta hyvänen aika
      Ikävä
      134
      1945
    5. Minun täytyisi lopettaa

      Kaipaaminen. Siksi kun en pysty mihinkään. Tulee vain harmia kun kaipaan. Olen niin väsynyt, ei kiinnosta mikään, enkä e
      Ikävä
      31
      1835
    6. Olet niin lähellä

      .... mutta en tiedä haluatko nähdä tai kuulla minusta. Minulla on ikävä sua, minua nuorempi nainen.
      Ikävä
      41
      1757
    7. Mies miten reagoisit jos

      satuttais näkemään sattumalta?
      Ikävä
      31
      1643
    8. Hävetkäämme!

      Rydman saa jatkaa. Hymyili leveästi haastattelujen aikana. Mikä meissä on vikana kun tuollainen "mies" ministerinä?
      Perussuomalaiset
      114
      1438
    9. Tänään onkin hyvä päivä

      Selata koko päivän Tinderin hunajaisia naisia. Jospa löytyy se rakkaus. Vähän kuin pelaisi hedelmäpelejä. 💘🍑🍍
      Sinkut
      61
      1319
    10. Miksi rikkaiden pitäisi

      maksaa köyhien ja laiskojen verot, en ymmärrä tätä laskuoppia?
      Maailman menoa
      177
      1302
    Aihe