Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymalizacja zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
maciu
Mam takie zapytanie do bazy:
  1. SELECT cms_plaintext.tid AS tid1, cms_text.tid AS tid2
  2. FROM cms_plaintext, cms_text WHERE ( cms_plaintext.hid='tytul' AND cms_plaintext.text LIKE '%".addslashes($szukaj)."%') OR ( cms_text.hid='wstep' AND cms_text.text LIKE '%".addslashes($szukaj)."%') AND cms_plaintext.tid != ".$_GET['id']." AND cms_text.tid != ".$_GET['id']."
  3. ORDER BY cms_plaintext.id DESC LIMIT 10


struktury tabel
Kod
CREATE TABLE `cms_plaintext` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `pid` int(10) unsigned NOT NULL default '0',
  `tid` int(11) unsigned NOT NULL default '0',
  `text` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id` (`id`),
  KEY `tid` (`tid`)
) ENGINE=MyISAM

Kod
CREATE TABLE `cms_text` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `pid` int(10) unsigned NOT NULL default '0',
  `tid` int(11) unsigned NOT NULL default '0',
  `text` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id` (`id`),
  KEY `tid` (`tid`)
) ENGINE=MyISAM

plus pare innych kolumn nie mającuch tu znaczenia.

Obie tabele zawierająpo kilka tysięcy rekordów
Zapytanie to wykonywało się się średnio przez 170sekund!!!

NIe bardzo wiem, jak możnaby je zoptymalizować, macie jakieś pomysły?
ActivePlayer
moze tak:
  1. SELECT cms_plaintext.tid AS tid1, cms_text.tid AS tid2
  2. FROM cms_plaintext, cms_text WHERE ( cms_plaintext.hid='tytul' AND LOCATE(".addslashes($szukaj).", cms_plaintext.text,0)>0 OR ( cms_text.hid='wstep' AND LOCATE(".addslashes($szukaj).", cms_text.text,0)>0 AND cms_plaintext.tid != ".$_GET['id']." AND cms_text.tid != ".$_GET['id']."
  3. ORDER BY cms_plaintext.id DESC LIMIT 10
maciu
niestety jest to błędne rozwiązanie, bo nie zwraca prawidłowych wyników, choć czas trwanie spadł do 150s

Edit:
Już wiem jakie jest prawidłowe rozwiązanie. Podaje kod, może się komuś przyda
  1. (SELECT tid
  2. FROM cms_plaintext WHERE tid <> ".$_GET['id']." AND hid='tytul' AND text LIKE '%".addslashes($szukaj)."%')
  3. UNION DISTINCT (SELECT tid
  4. FROM cms_text WHERE tid <> ".$_GET['id']." AND hid='wstep' AND text LIKE '%".addslashes($szukaj)."%')
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.