Avatar billede sjh Nybegynder
01. januar 2008 - 08:06 Der er 8 kommentarer og
1 løsning

Optimering af distinct

Jeg har et problem med en langsom sql-string eller også er det min server.. :P

Den her tager mellem 30-90 sek at køre, hver gang jeg skifter self_id (self_id = 2)

SELECT DISTINCT im.year FROM idb_movie im
  INNER JOIN idb_userself iu ON iu.idb_id = im.id AND iu.self_id = 2
  WHERE iu.self_id = 2 ORDER BY im.year DESC;


CREATE TABLE `idb_movie` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `ord` tinyint(3) unsigned NOT NULL default '0',
  `title` varchar(200) NOT NULL,
  `year` smallint(1) unsigned NOT NULL default '0',
  `url` varchar(255) default '0',
  PRIMARY KEY  (`id`),
  KEY `Year` (`year`),
  FULLTEXT KEY `Title` (`title`)
) ENGINE=MyISAM AUTO_INCREMENT=212396 DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED;

CREATE TABLE `idb_userself` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `idb_id` int(11) unsigned NOT NULL default '0',
  `genre_id` int(11) unsigned NOT NULL default '0',
  `group_id` int(11) unsigned NOT NULL default '0',
  `self_id` int(11) unsigned NOT NULL default '0',
  `movie_number` int(11) unsigned default '0',
  PRIMARY KEY  (`id`),
  KEY `Idb` (`idb_id`),
  KEY `Genre` (`genre_id`),
  KEY `Group` (`group_id`),
  KEY `Self` (`self_id`)
) ENGINE=MyISAM AUTO_INCREMENT=20001 DEFAULT CHARSET=latin1;


Nogle forslag til hvordan jeg kan optimer den ??
Avatar billede arne_v Ekspert
01. januar 2008 - 16:57 #1
Hvor mange rækker returneres der uden distinct ?

Jeg forstår ikke hvorfor iu.self_id = 2 er både i JOIN og i WHERE betingelse.
Avatar billede arne_v Ekspert
01. januar 2008 - 16:59 #2
Har du prøvet en subquery:

SELECT DISTINCT im.year
FROM idb_movie im
WHERE im.id IN (SELECT iu.idb FROM idb_userself iu WHERE iu.self_id = 2)
ORDER BY im.year DESC

?
Avatar billede sjh Nybegynder
01. januar 2008 - 17:45 #3
Ja i idb_movie er der 212395 og i idb_userself er der 20000 og med WHERE iu.self_id = 2 så er der 10000

men det ser ud til at din løsning 16:59:41 køre en del bedre end min, nu kom den ned på 17 sek..
Avatar billede sjh Nybegynder
01. januar 2008 - 17:55 #4
ja 17 sek er når computer lige har genstartet ellers er det 0,710 sek.. der er vel også godt nok er det ikke.. eller kan det optimeres mere.. ??
Avatar billede arne_v Ekspert
01. januar 2008 - 18:10 #5
Man ved aldrig. Men jeg har ihvertfald ikke flere ideer.
Avatar billede sjh Nybegynder
01. januar 2008 - 18:47 #6
nej der er nok ikke nogle bedre ider.. ellers venter jeg lige en lille dags tid..

smider du lige et svar..
Avatar billede arne_v Ekspert
01. januar 2008 - 19:00 #7
ok
Avatar billede sjh Nybegynder
02. januar 2008 - 18:33 #8
Mange tak for hjælpen..
Avatar billede sjh Nybegynder
09. januar 2008 - 08:05 #9
arne_v Nu fandt jeg ud af hvordan jeg optimer den.. det var mig table som åbenbart blev langsom ved at bruge ROW_FORMAT=FIXED

Jeg har nu ændret den til ROW_FORMAT=COMPRESSED nu tager det 0,05 sek ;)

Men syntes bare jeg haved læst at ROW_FORMAT=FIXED skulle være den hurtigste table men at den så også fylder mere.. og Ja det er stor forskel..

med ROW_FORMAT=FIXED fylder min table 108MB
og med ROW_FORMAT=COMPRESSED fylder den 21 MB
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