Avatar billede tagman Nybegynder
27. april 2005 - 00:42 Der er 13 kommentarer

select * og indexes

Hej alle!

Er ved at lave en lille migration fra MS SQL til MySQL.

I MS SQL går følgende lyn-hurtigt:

SELECT * FROM stor_tbl_paa_19_MB

...men i MySQL går det pinligt langsomt. Der går faktisk omkring 2-3 sekunder før den kommer i gang med at generere output.

Jeg har kørt dette uden held:

ALTER TABLE stor_tbl_paa_19_MB ADD INDEX(id)
OPTIMIZE TABLE stor_tbl_paa_19_MB

Desuden har jeg sat diverse variabler i my.cnf ret højt op.

Tabellen er en MyISAM.

Jeg tænkte på følgende:

Hvad bør diverse værdier i my.cnf sættes til? Jeg har 4-doblet alle dem, der gav mening (cache, buffer og memory variabler) og der er 512 MB RAM at gøre godt med.

Bør jeg skifte storage engine?

EXPLAIN SELECT * FROM stor_tbl_paa_19_MB

...fortæller mig i øvrigt, at MySQL ikke bruger nogle indexes på denne query. Det gør den derimod på:

SELECT en_eller_anden_kolonne FROM stor_tbl_paa_19_MB
Avatar billede Slettet bruger
27. april 2005 - 02:01 #1
Nu tror jeg, at jeg har forstået din post - men til dit spørgsmål om configen, er det en del af mySQL ideolismen, at det burde kunne fungere rimelig optimalt "out-of-the-box", tag f.eks. http://sdss.org/, hvis db overskrider 3.4 millarder rækker, og fylder over 812GB!

Det med indexes, skal vidst sættes på felter du søger på, så hvis en_eller_anden_kolonne er den du skal indexere, og ikke id.

--
pacroon
Avatar billede Slettet bruger
27. april 2005 - 02:02 #2
Og "ideolismen" skulle vidst enten have været "ideologien", eller "idealismen"! :)
Avatar billede tagman Nybegynder
27. april 2005 - 09:49 #3
"ideolismen" er det nye slang i mine ører =)

Okay, så jeg kan forstå, at det ikke er variabler i my.cnf, der skal sættes. Det har heller ikke noget med indexes at gøre, da de kun er relevante i en WHERE clause.

Findes der så noget andet, jeg kan gøre iforb. med performance på min SELECT * ?
Avatar billede Slettet bruger
27. april 2005 - 12:19 #4
Ja, der kommer jeg så lidt til kort - men det er også taget i betragtning af, af det jo kun var en kommentar jeg kom med, og ikke et svar :)

Men måske der findes nogle guides til mssql -> mysql optimering på nettet...
Avatar billede tagman Nybegynder
27. april 2005 - 16:13 #5
Jeps, men jeg tror faktisk (heldigvis) ikke det har noget at gøre med migrationen - tabellerne ser jo fine nok ud. Jeg nævner blot MS SQL, fordi at det er den database vi kommer fra og den KAN nemlig godt lave en SELECT * på et splitsekund.

...og hvis MySQL også kan, så er vi så godt som migreret =)
Avatar billede arne_v Ekspert
27. april 2005 - 20:35 #6
Hvordan måler du de 2-3 sekunder ?

mysql command line utility / PHP / Java / C# / C++ /ASP ?
Avatar billede tagman Nybegynder
27. april 2005 - 21:28 #7
MySQL command line - så de har desværre heller ikke noget med en driver at gøre =(

De 2-3 sekunder er naturligvis bare et kompetent menneske-gæt på hvor stor forsinkelsen er.

Følgende tager også noget tid:

SELECT col1, col2, col3 FROM tbl1 JOIN tbl2 ON tbl2.col1=tbl1.col2 JOIN tbl3 ON tbl3.col3=tbl2.col2 ORDER BY RAND()

ORDER BY RAND() virker i det hele taget ret langsom. Denne query har jeg dog ikke kørt nogen EXPLAIN på endnu.
Avatar billede arne_v Ekspert
27. april 2005 - 21:30 #8
Hvad bruger du mod SQLServer ?

Og hvad er tiderne for de 2 førend de sidste data er hentet ?
Avatar billede arne_v Ekspert
27. april 2005 - 21:31 #9
ORDER BY RAND()

er en lidt heftig operation på en tabel med mange række
Avatar billede arne_v Ekspert
27. april 2005 - 21:33 #10
tilbage til problemet

hvis nu den ene gør

while(more) {
  hent en række
  print en række
}

og den anden hør

while(more) {
  hent en række
}
print alle rækker

så vil der være en kunstig forskel på visningen af første række.

Men visningen på sidste række skulle være mere sammenlignelig
Avatar billede tagman Nybegynder
27. april 2005 - 23:21 #11
Jeg forstår hvad du mener, men det er desværre heller ikke tilfældet =(

Jeg har fyret kommandoen af med samme klient program og med ODBC driver til både MSSQL og MySQL - hvor MySQL OGSÅ bruger tid på at "tænke" inden den giver output.

Som sagt giver "SELECT col1, col2, col3 FROM table" meget hurtigere resultater end "SELECT * FROM table".
Avatar billede tagman Nybegynder
27. april 2005 - 23:22 #12
> Hvad bruger du mod SQLServer ?
> Og hvad er tiderne for de 2 førend de sidste data er hentet ?

ODBC på begge 2, men den ene Server (MS SQL) står uden af huset - dvs. forbindelsen sker via. Internettet. Derfor er det endnu mere imponerende, at SQL Server faktisk kører hurtigere lige p.t.
Avatar billede tagman Nybegynder
27. april 2005 - 23:23 #13
ORDER BY RAND()

...er langsom

ORDER BY NEWID()

...men SQL Server virker også mere tjep her.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester