Avatar billede egeriis Nybegynder
09. maj 2006 - 16:15 Der er 17 kommentarer og
2 løsninger

500.000 records - hvad er mest optimalt?

Det er sådan at jeg går og arbejder på et website som har en tabel tilknyttet, hvori der vil kunne findes op til 500.000 rækker.
Hvordan er det mest optimalt at opdele dette når det skal fungere hurtigt og pålideligt, uden at belaste serveren for meget, osv.? Skal man ud i at dele det op over flere tabeller, eller hvordan?

På forhånd tak.
Avatar billede michael_stim Ekspert
09. maj 2006 - 16:17 #1
Det kommer helt an på hvordan den tabel ser ud. Men man skal for så vidt muligt normalisere sine tabeller så meget som muligt. Og så kommer det også an på om de felter du søger på er indexeret. Men 500.000 records betyder ikke noget.
Avatar billede egeriis Nybegynder
09. maj 2006 - 16:34 #2
Så det er måske bare min måde at håndtere dataene på som gør at det kører langsomt? Eller er det serverens hardware som begrænser tilgangen?
Avatar billede arne_v Ekspert
09. maj 2006 - 16:37 #3
en tabel
de rigtige index
undgaa fysisk og logisk fragmentering

og saa er 500000 reakker ikke specielt meget - er det store records ?
Avatar billede egeriis Nybegynder
09. maj 2006 - 17:00 #4
De er forholdsvis store.

Hvad er fragmentering mht. MySQL?

Kan man have for mange index? Da jeg forsøgte at optimere sidst, lavede jeg et par stykker som måske er unødvendige.
Avatar billede arne_v Ekspert
09. maj 2006 - 17:20 #5
index koster lidt ved INSERT
Avatar billede arne_v Ekspert
09. maj 2006 - 17:25 #6
MyISAM tabeller:
  fragmentering af filerne paa disk - kan forbedres med normal defragmentering
  (med MySQL lukket ned)
  fragmentering af raekker internt i fil - jeg ved faktisk ikke meget om
  MySAL MyISAM i denne sammenhaeng, men docs har bl.a. http://mysql.telepac.pt/doc/refman/5.0/en/optimize-table.html
Avatar billede egeriis Nybegynder
09. maj 2006 - 17:43 #7
Mht. optimize table, så ved jeg at phpMyAdmin har en funktion til dette, tror du måske det er denne du henviser til sidstnævnt?

Men hvordan kan det så forklares at det kører rigtig langsomt?
Avatar billede michael_stim Ekspert
09. maj 2006 - 17:46 #8
Jeg er sikker på at Arne har et godt svar. Men det er lidt svært at vide hvad man skal svare på, når man hverken har struktur eller forspørgsel.
Avatar billede arne_v Ekspert
09. maj 2006 - 17:50 #9
har du proevet EXPLAIN paa dine queries ?
Avatar billede arne_v Ekspert
09. maj 2006 - 17:55 #10
Jeg kan heller ikke sige noget konkret uden tabel struktur og quesries, men
EXPLAIN maa vaere en mulig vej frem
Avatar billede egeriis Nybegynder
10. maj 2006 - 10:35 #11
Hmm, jeg kan ikke se hvad jeg får ud af EXPLAIN?
Avatar billede egeriis Nybegynder
10. maj 2006 - 10:41 #12
Arh, den forklarer hvordan den udfører mit query, fandt jeg lige ud af.

- At kigge i manual først -

Det er nok fordi jeg udfører en masse queries i træk det kører langsomt?
Avatar billede egeriis Nybegynder
10. maj 2006 - 11:47 #13
Jeg prøver lige at poste struktur på de to tabeller jeg bruger og resultatet af min EXPLAIN på et forespørgsels eksempel:


CREATE TABLE `ads` (
  `id` int(11) NOT NULL auto_increment,
  `kundeid` int(11) NOT NULL default '0',
  `ordrenr` int(11) NOT NULL default '0',
  `note` text collate latin1_danish_ci NOT NULL,
  `sogeord` text collate latin1_danish_ci NOT NULL,
  `branche` varchar(100) collate latin1_danish_ci NOT NULL default '',
  `omrade` enum('Bornholm','Fyn','Hele landet','Jylland','Lolland-Falster','Midtjylland','Midtsjælland','Nordjylland','Nordsjælland','Sjælland','Storkøbenhavn','Sydsjælland','Sønderjylland','Vestjylland','Vestsjælland','Østjylland') collate latin1_danish_ci NOT NULL default 'Hele landet',
  `postnummer` int(4) NOT NULL default '0',
  `type` enum('1','1x','2','2x','3','3x','4','4x','5','5x','6','6x') collate latin1_danish_ci NOT NULL default '1',
  `show` int(11) NOT NULL default '1',
  `urlclicks` int(6) NOT NULL default '0',
  KEY `id` (`id`),
  KEY `branche` (`branche`),
  KEY `postnummer` (`postnummer`),
  KEY `omrade` (`omrade`),
  KEY `sogeord` (`sogeord`(1000))
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci AUTO_INCREMENT=520408 ;


Array
(
    [0] => Array
        (
            [0] => 1
            [id] => 1
            [1] => SIMPLE
            [select_type] => SIMPLE
            [2] => a
            [table] => a
            [3] => ALL
            [type] => ALL
            [4] =>
            [possible_keys] =>
            [5] =>
            [key] =>
            [6] =>
            [key_len] =>
            [7] =>
            [ref] =>
            [8] => 486445
            [rows] => 486445
            [9] => Using filesort
            [Extra] => Using filesort
        )

    [1] => Array
        (
            [0] => 1
            [id] => 1
            [1] => SIMPLE
            [select_type] => SIMPLE
            [2] => c
            [table] => c
            [3] => eq_ref
            [type] => eq_ref
            [4] => PRIMARY
            [possible_keys] => PRIMARY
            [5] => PRIMARY
            [key] => PRIMARY
            [6] => 4
            [key_len] => 4
            [7] => a.kundeid
            [ref] => a.kundeid
            [8] => 1
            [rows] => 1
            [9] => Using where
            [Extra] => Using where
        )

)
EXPLAIN SELECT c.navn,c.adresse,c.postnr,c.by,c.tlf,c.mobil,c.fax,a.type FROM ads a JOIN customers c ON c.id=a.kundeid WHERE (c.navn LIKE '%maler%' OR a.branche LIKE '%maler%' OR a.sogeord LIKE '%maler%') ORDER BY a.type DESC
Avatar billede egeriis Nybegynder
15. maj 2006 - 13:43 #14
Jeg synes det gik lidt i stå?
Avatar billede arne_v Ekspert
16. maj 2006 - 04:48 #15
ja - sorry

vi behøver vist ikke studere explain output nærmere

WHERE felt LIKE '%xxx%'

er en performance killer

fordi den ikke kan bruge index

(WHERE felt LIKE 'xxx%' kan bruge index)
Avatar billede egeriis Nybegynder
16. maj 2006 - 14:23 #16
Arh, alright. Ja se det er jo faktisk lidt et problem, så skal jeg jo finde på en lidt anden måde at dele det op på måske. Hmm.. Det må jeg vist hellere kigge nærmere på..
Avatar billede arne_v Ekspert
19. juni 2006 - 00:16 #17
tid at få afsluttet her ?
Avatar billede egeriis Nybegynder
18. juni 2007 - 13:47 #18
Ja, det må være tid til at få afsluttet. Du har givet mig et delvist svar, derfor vil jeg gerne tildele dig 50%.
Avatar billede arne_v Ekspert
18. juni 2007 - 17:25 #19
svar
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