Avatar billede sjh Nybegynder
17. december 2007 - 14:26 Der er 12 kommentarer og
1 løsning

Count og Inner Join

Jeg ville bare lige høre om det kan passe at man skal lave en Inner Join når man ikke skal bruge data til noget fra inner join.. Eller er det meget normalt at det laves på den måde ?

Jeg skal selfølige bruge: iu.idb_id = im.id :men vil det ikke være langsomt når man bruger inner join.. eller er det bare mig som ikke kan se det.. :D


SELECT COUNT(*) FROM idb_movie im
INNER JOIN idb_userself iu ON iu.idb_id = im.id
WHERE iu.self_id = 2
AND im.year = 2004
AND iu.genre_id = 1
AND iu.origin_id = 1;
Avatar billede erikjacobsen Ekspert
17. december 2007 - 14:29 #1
Du bruger iu.self_id og im.year (og mere fra im) - så skal du vel lave en join. En join er som sådan ikke langsom - forudsat der er indexer på de felter du joiner på.
Avatar billede fennec Nybegynder
17. december 2007 - 14:33 #2
Det kan godt være du ikke skal bruge resultatet til noget, men du har det med på dine søgekriterier. Du kan jo ikke bruge "iu.genre_id = 1", hvis tabellen ikke er joinet. Derfor er du nød til at joine.

Du kan dog evt bruge IN() metoden i stedet, men jeg tør ikke sige om den er hurtigere:

SELECT COUNT(*) FROM idb_movie
where id in(select idb_id from idb_userself where genre_id = 1 and origin_id = 1)
Avatar billede sjh Nybegynder
17. december 2007 - 14:33 #3
hmm der er ikke indexer felter på "idb_id"

CREATE TABLE `idb_movie` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `ord` tinyint(6) unsigned NOT NULL default '0',
  `title` varchar(150) NOT NULL default '',
  `year` smallint(5) unsigned NOT NULL default '0',
  `url` varchar(255) default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;


CREATE TABLE `idb_userself` (
  `id` int(11) unsigned NOT NULL default '0',
  `idb_id` int(11) unsigned NOT NULL default '0',
  `genre_id` int(11) unsigned NOT NULL default '0',
  `origin_id` int(11) unsigned NOT NULL default '0',
  `self_id` int(11) unsigned NOT NULL default '0',
  `comment` tinytext,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Avatar billede sjh Nybegynder
17. december 2007 - 14:40 #4
fennec Jeg har lige prøvet med IN() og kan tydeligt se at det er langsomt.. så det er nok ikke den vej :D
Avatar billede sjh Nybegynder
17. december 2007 - 14:46 #5
Det skal måske lige siges at det drejer sig om lidet over 210.000 posts så måske derfor jag kan se det er langsomt..
Avatar billede erikjacobsen Ekspert
17. december 2007 - 15:00 #6
`idb_id` kunne så nok trænge til et index.
Avatar billede erikjacobsen Ekspert
17. december 2007 - 15:01 #7
Og måske nogle andre - men det afhænger lidt af hvad du bruger dem til. Hvad er fx  iu.self_id ?
Avatar billede sjh Nybegynder
17. december 2007 - 15:31 #8
Hvis jeg smider index på idb_id og self_id så behøver det vel ikke være et unik index vel ??

erikjacobsen du må også godt smide et svar
Avatar billede erikjacobsen Ekspert
17. december 2007 - 15:37 #9
Det skal i hvert fald kun være et unikt index hvis det er unikt ;)  Er der noget der går hurtigere?

Har du en sammentælling du skal lave tit kan man sommetider forsvare at have redundans i databasen - altså skrive antallet i et felt i en tabel, og bare slå op i den, i stedet for at tælle hver gang. Og så skal man lige huske tælle det felt op og ned ved ændringer, s'fø'li.

Jeg samler slet ikke på point, tak.
Avatar billede sjh Nybegynder
17. december 2007 - 15:53 #10
jo men self_id og idb_id må ikke være unikt da samme xxx_id kan forkomme op til flere gange..

self_id = er bruger id
idb_id = film id

og jeg skal også have lavet noget søgning i det så jeg kan nok ikke bruge den med at lave et felt som gemmer antal da 99.9% af en søning ikke giver samme resultat..
Avatar billede sjh Nybegynder
17. december 2007 - 15:54 #11
hvad med dig fennec.. vil du have point så smid et svar..
Avatar billede fennec Nybegynder
17. december 2007 - 15:57 #12
Nej tak. Det er Eriks løsning, og den vil jeg ikke tage point for.
.o) <-- One Eyed Jack
Avatar billede sjh Nybegynder
17. december 2007 - 16:02 #13
fennec hæ hæ.. :D bare iorden..

men i skal have mange tak for jeres hjælp alivel..
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