search engine PHP/MySQL

Programovacie jazyky, rady, poradňa...
sanyika
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 364
Registrovaný: 11 apr 2006, 15:35
Bydlisko: Treti smetiak vpravo....d

search engine PHP/MySQL

Príspevok od používateľa sanyika »

Ako dosiahnem najefektivenjsie a narychlejsie vyhladavanie pomocou PHP/MySQL (momentalne mi tak hadze vysledok behom 5 sekund), aby som dosiahol vysledky do 1 sekundy?

V tabulke mam 504355 zaznamov, engine InnoDB.
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: search engine PHP/MySQL

Príspevok od používateľa weroro »

Ukáž návrh tvojej DB a spôsob dopytov.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8222
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: search engine PHP/MySQL

Príspevok od používateľa harrison314 »

Ak nepouzivas fulltext, tak ho pouzi, ak ho pouzivas tak budes musiet siahnut po specializovanom rieseni:elasticsearch, sphinx, solr,...
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: search engine PHP/MySQL

Príspevok od používateľa audiotrack »

fulltext na innoDB je v až MySQL 5.6.4 a vyššie, takže to mal aj napísať akú má verziu, a vyhli by sme sa zbytočným trom príspevkom vrátane môjho
sanyika
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 364
Registrovaný: 11 apr 2006, 15:35
Bydlisko: Treti smetiak vpravo....d

Re: search engine PHP/MySQL

Príspevok od používateľa sanyika »

Web server
Apache/2.2.14 (Ubuntu)
MySQL client version: 5.1.69
PHP extension: mysqli
zaznamy do nasledovnej tabulky si generujem pomocou scriptu v crone

Kód: Vybrať všetko

--
-- Table structure for table `search_table`
--

CREATE TABLE IF NOT EXISTS `search_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vendor_id` tinyint(1) NOT NULL DEFAULT '1',
  `sid` varchar(32) COLLATE utf8_czech_ci NOT NULL,
  `name_orig` varchar(128) COLLATE utf8_czech_ci NOT NULL,
  `name` varchar(128) COLLATE utf8_czech_ci NOT NULL,
  `name_preg` varchar(128) COLLATE utf8_czech_ci NOT NULL,
  `help1` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `help2` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `type` tinyint(4) NOT NULL,
  `priority` smallint(6) NOT NULL,
  `active` tinyint(1) NOT NULL,
  `lang` varchar(3) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `vendor_id` (`vendor_id`,`type`,`active`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=2731231 ;
tu su pre ukazku aj dva zaznamy z tabulky

Kód: Vybrať všetko

INSERT INTO `search_table` (`id`, `vendor_id`, `sid`, `name_orig`, `name`, `name_preg`, `help1`, `help2`, `type`, `priority`, `active`, `lang`) VALUES
(2731209, 0, '4748389', 'Julian Assange: Neautorizovaná autobiografie', 'julian assange: neautorizovana autobiografie', 'julianassangeneautorizovanaautobiografie', '9788074620126', '978-80-7462-012-6', 1, 0, 1, ''),
(2731215, 0, '4748397', 'Když jsme zhubly my, zhubnete i vy', 'kdyz jsme zhubly my, zhubnete i vy', 'kdyzjsmezhublymyzhubneteivy', '9788072175253', '978-80-7217-525-3', 1, 0, 1, '');
PHP kod pre vyhladavanie

Kód: Vybrať všetko

		$sresults[1] = mq_select_a("search_table", "sid", "sid", "(name LIKE '%{$keyword}%' OR help1 LIKE '{$keyword}' OR help2 LIKE '{$keyword}%') AND `type`=1 AND active=1 AND vendor_id={$domain->vendor}", "sid", "ORDER BY priority DESC");
		if(count($sresults[1]) == 0) {
			$skeyword = preg_replace("/[^a-z0-9]*/i","",$keyword);
			$sresults[1] = mq_select_a("search_table", "sid", "sid", "name_preg LIKE '%{$skeyword}%' AND `type`=1 AND active=1 AND vendor_id={$domain->vendor}", "sid", "ORDER BY priority DESC");
		}
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: search engine PHP/MySQL

Príspevok od používateľa audiotrack »

čo je za funkciu mg_select_a? Možno je samotná tá funkcia neoptimálne napísaná, ale ak je to iba nejaký wraper pre klasické mysql(i)_query tak s tým nič nenarobíš. Jediné dve riešenia čo máš, sú:

1) prechod na aktuálnu verziu mysql a používať fulltext
2) totálne prerobiť celý návrh, a vytvoriť si samostatnú tabuľku so slovami a idečkami záznamov kde sa nachádzajú. V podstate takú indexovú tabuľku

to, že je to ale pomalé, môže spôsobovať aj niečo iné, a nie samotné toto vyhladávanie. Prečítaj si napríklad toto: http://www.ajaxline.com/node/2099
sanyika
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 364
Registrovaný: 11 apr 2006, 15:35
Bydlisko: Treti smetiak vpravo....d

Re: search engine PHP/MySQL

Príspevok od používateľa sanyika »

dakujem.... to s tym FULLTEXTom pre InnoDB som ani netusil. Vela to pomoze ked to nasadim.
Napísať odpoveď