Avatar billede tipsen Nybegynder
14. marts 2004 - 12:57 Der er 8 kommentarer

Optimering af forespørgsel

Jeg har følgende 3 tabeller:

CREATE TABLE modules (
  id int(10) unsigned NOT NULL auto_increment,
  filename varchar(50) NOT NULL default '',
  description varchar(255) NOT NULL default '',
  help text NOT NULL,
  PRIMARY KEY  (id)
) TYPE=MyISAM;

CREATE TABLE templates_pages (
  id int(11) unsigned NOT NULL auto_increment,
  name varchar(200) NOT NULL default '',
  pagetitle varchar(255) NOT NULL default '',
  source mediumtext NOT NULL,
  secure tinyint(1) NOT NULL default '1',
  trusted tinyint(1) NOT NULL default '1',
  timestamp timestamp(14) NOT NULL,
  PRIMARY KEY  (id)
) TYPE=MyISAM;

CREATE TABLE template_modules (
  id int(10) unsigned NOT NULL auto_increment,
  tpl_id int(10) unsigned NOT NULL default '0',
  mod_id int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (id)
) TYPE=MyISAM;

hvor template_modules.tpl_id refererer til templates_pages.id og template_modules.mod_id refererer til modules.id - dét er hvad der linker tabellerne sammen. Mit input er så en værdi fra templates_pages.name og jeg skal så finde filnavne på de moduler der hører til denne template. Jeg har fundet ud af at gøre det vha. nedenstående query, men jeg har også på fornemmelsen, at den er håbløst inefficient, så hvis den kan forbedres vil jeg meget gerne høre det - helst med en tilhørende forklaring af hvorfor en ændring også er en forbedring ;-)

SELECT filename
FROM modules, template_modules, templates_pages
WHERE templates_pages.name = 'kontakt' AND templates_pages.id = template_modules.tpl_id AND template_modules.mod_id = modules.id

På forhånd tak!

Mvh

Tommy
Avatar billede arne_v Ekspert
14. marts 2004 - 13:02 #1
Jeg tror at den er OK.

Men index på følgende felter er en god ide:
  templates_pages.name
  template_modules.tpl_id
  template_modules.mod_id
Avatar billede rasmusbg Nybegynder
14. marts 2004 - 13:07 #2
Jeg ved ikke om det er mere effektivt, men det er da et forsøg værd :o)

SELECT modules.filename
(template_modules JOIN templates_pages ON template_modules.tpl_id = template_pages.id)
JOIN modules ON template_modules.mod_id = modules.id
Avatar billede rasmusbg Nybegynder
14. marts 2004 - 13:10 #3
Arne > Bliver der ikke automatisk genereret et index for primær nøgler?
Avatar billede arne_v Ekspert
14. marts 2004 - 13:12 #4
Jo.

Derfor er primær nøglerne heller ikke med i den foreslåede liste.
Avatar billede rasmusbg Nybegynder
14. marts 2004 - 13:13 #5
Hehe...så ikke lige, at det ikke var på primær nøglerne, der skulle være index ;o)
Og så mangler der lige en

WHERE templates_pages = 'kontakt'

i den query, jeg postede...
Avatar billede muddi Praktikant
14. marts 2004 - 16:04 #6
Brug EXPLAIN til at få vist i hvilken rækkefølge dine tabeller joines. På den måde kan du hurtigt se hvor der skal tilføjes yderligere index.
Avatar billede terry Ekspert
14. marts 2004 - 19:44 #7
tommy can you take a look at this question please >http://www.eksperten.dk/spm/475034
Avatar billede arne_v Ekspert
12. april 2004 - 21:30 #8
Lukke tid ?
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