Avatar billede sjh Nybegynder
29. december 2007 - 21:41 Der er 15 kommentarer og
1 løsning

Underlig langsom sql-string

Jeg fatter ikke hvorfor min første sql-string(1) er 1.75 sek om at lave en søning når min sql-string(2) kan gøre det på 0.02 sek bare fordi jeg tilføjer:
"AND MATCH(im.title) AGAINST ('boot')" efter "WHERE iu.self_id = 2"


sql-string(1): 1.75 sek
SELECT im.id, iu.movie_number AS number, im.title, im.year, im.url, ig.danish AS genre,
  io.text AS ugroup, ic.comment, ir.result, MATCH(im.title) AGAINST ('boot') AS Score
  FROM idb_movie im
  INNER JOIN idb_userself iu ON iu.idb_id = im.id
  LEFT JOIN idb_genre ig ON ig.id = iu.genre_id
  LEFT JOIN idb_group io ON io.id = iu.group_id AND io.self_id = 2
  LEFT JOIN idb_comment ic ON ic.idb_id = im.id AND ic.self_id = 2
  LEFT JOIN idb_rating ir ON ir.id = im.id
  WHERE iu.self_id = 2
  HAVING Score ORDER BY Score LIMIT 0,20;


sql-string(2): 0.02 sek
SELECT im.id, iu.movie_number AS number, im.title, im.year, im.url, ig.danish AS genre,
  io.text AS ugroup, ic.comment, ir.result, MATCH(im.title) AGAINST ('boot') AS Score
  FROM idb_movie im
  INNER JOIN idb_userself iu ON iu.idb_id = im.id
  LEFT JOIN idb_genre ig ON ig.id = iu.genre_id
  LEFT JOIN idb_group io ON io.id = iu.group_id AND io.self_id = 2
  LEFT JOIN idb_comment ic ON ic.idb_id = im.id AND ic.self_id = 2
  LEFT JOIN idb_rating ir ON ir.id = im.id
  WHERE iu.self_id = 2 AND MATCH(im.title) AGAINST ('boot')
  HAVING Score ORDER BY Score LIMIT 0,20;

Nogle som kan forklare det...???
Avatar billede arne_v Ekspert
29. december 2007 - 21:46 #1
Det ekstra kriterie for vel frasorteret en masse rækker på en effektiv måde.

Du kan prøve og lade EXPLAIN fortælle dig hvad MySQL gør fir de 2 queries.
Avatar billede sjh Nybegynder
29. december 2007 - 21:58 #2
hvordan gør jeg det med EXPLAIN ??
Avatar billede arne_v Ekspert
29. december 2007 - 22:02 #3
Avatar billede arne_v Ekspert
29. december 2007 - 22:03 #4
http://www.eksperten.dk/artikler/6 er nok for kortfattet til at du får noget ud af det.
Avatar billede sjh Nybegynder
29. december 2007 - 22:06 #5
det ser sådan ud..

sql-string(1): 1.75 sek
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ic system <MEMO> <NULL> <NULL> <NULL> 0 const row not found
1 SIMPLE ir system <MEMO> <NULL> <NULL> <NULL> 0 const row not found
1 SIMPLE iu ALL <MEMO> <NULL> <NULL> <NULL> 50000 Using where; Using temporary; Using filesort
1 SIMPLE ig ref <MEMO> search <BLOB> <MEMO> 1 
1 SIMPLE io eq_ref <MEMO> PRIMARY <BLOB> <MEMO> 1 
1 SIMPLE im eq_ref <MEMO> PRIMARY <BLOB> <MEMO> 1 

sql-string(2): 0.02 sek
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ic system <MEMO> <NULL> <NULL> <NULL> 0 const row not found
1 SIMPLE ir system <MEMO> <NULL> <NULL> <NULL> 0 const row not found
1 SIMPLE im fulltext <MEMO> unik <BLOB> <MEMO> 1 Using where; Using filesort
1 SIMPLE iu ref <MEMO> search <BLOB> <MEMO> 1 Using where
1 SIMPLE ig ref <MEMO> search <BLOB> <MEMO> 1 
1 SIMPLE io eq_ref <MEMO> PRIMARY <BLOB> <MEMO> 1
Avatar billede arne_v Ekspert
29. december 2007 - 22:16 #6
Nu er jeg ikke nogen ørn til EXPLAN men jeg læser dem som føler.

1)

Find 50000 rækker i iu
find 1 række i ig
find 1 række i io
find 1 række i im

2)

find 1 række i im
find 1 række i iu
find 1 række i ig
find 1 række i io
Avatar billede arne_v Ekspert
29. december 2007 - 22:16 #7
Åbenlyst at #2 er hurtigere !
Avatar billede arne_v Ekspert
29. december 2007 - 22:17 #8
Er der index på alle join felter og where felter ?
Avatar billede erikjacobsen Ekspert
29. december 2007 - 22:18 #9
Hvad er typerne på felterne, og hvad har du indexer på?
Avatar billede barklund Nybegynder
29. december 2007 - 23:04 #10
Hvor mange rækker matcher (1) i forhold til hvor mange rækker der ville komme ud af det uden den where, der er i (1)? Bare antallet af rækker. Indexer virker bedst, når de kun udvælger en del af sættet - skal hele (eller næsten hele) sættet ud, så kan indexet være ligegyldigt.
Avatar billede barklund Nybegynder
29. december 2007 - 23:04 #11
Altså, også uden limit selvfølgelig :)
Avatar billede sjh Nybegynder
29. december 2007 - 23:29 #12
ja jeg roder nok lidt rundt i det.. men her er mine tabels

CREATE TABLE `idb_comment` (
  `idb_id` int(11) unsigned NOT NULL default '0',
  `self_id` int(11) unsigned NOT NULL default '0',
  `comment` tinytext,
  KEY `Imdb` (`idb_id`),
  KEY `Self` (`self_id`),
  FULLTEXT KEY `Comment` (`comment`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED;

CREATE TABLE `idb_genre` (
  `id` int(11) unsigned NOT NULL default '0',
  `danish` varchar(64) NOT NULL,
  `english` varchar(64) NOT NULL,
  KEY `Id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `idb_group` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `self_id` int(11) unsigned NOT NULL default '0',
  `text` varchar(35) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `Self` (`self_id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

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`),
  KEY `Year` (`year`),
  KEY `Ord` (`ord`),
  FULLTEXT KEY `Title` (`title`)
) ENGINE=MyISAM AUTO_INCREMENT=212396 DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED;

CREATE TABLE `idb_rating` (
  `id` int(11) unsigned NOT NULL default '0',
  `rating` int(11) unsigned NOT NULL default '0',
  `counts` int(11) unsigned NOT NULL default '0',
  `result` int(11) unsigned NOT NULL default '0',
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

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 `Imdb` (`idb_id`),
  KEY `Genre` (`genre_id`),
  KEY `Group` (`group_id`),
  KEY `Self` (`self_id`)
) ENGINE=MyISAM AUTO_INCREMENT=50001 DEFAULT CHARSET=latin1;
Avatar billede sjh Nybegynder
29. december 2007 - 23:39 #13
1)
37500 | Using where; Using temporary; Using filesort

2)
1 | Using where; Using filesort
Avatar billede sjh Nybegynder
30. december 2007 - 22:50 #14
Når jeg tror jeg fik svar på mit spørgsmål..

Kan arne_v smide et svar.. så jeg kan få lukket mit sidste spørgsmål i år.. :D
Avatar billede arne_v Ekspert
30. december 2007 - 22:56 #15
kommer her
Avatar billede sjh Nybegynder
30. december 2007 - 22:59 #16
Mange tak for hjælpen.. vi snakkes nok ved i det nye år :D

Godt nytår til jer..
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