CREATE TABLE `Team` (
`id` int(10) unsigned NOT NULL auto_increment,
`tag_id` int(10) unsigned NOT NULL,
`name` varchar(80) NOT NULL,
`type` tinyint(4) NOT NULL default '0',
`desc` text,
`flag` varchar(200) default NULL,
`city` varchar(80) default NULL,
`country` varchar(50) default NULL,
`status` tinyint(4) NOT NULL default '0',
`sport_id` int(10) unsigned NOT NULL,
`metadata` text,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `status` (`status`),
KEY `sport_id` (`sport_id`),
KEY `tag_id` (`tag_id`),
KEY `location` (`city`,`country`)
) ENGINE=InnoDB AUTO_INCREMENT=270 DEFAULT CHARSET=utf8 COMMENT='Team entity'
i potrebno je na osnovu query stringa izvuci odredjene timove, query je comma-separated lista kriterijuma koji treba da se zadovolje. polja koja se pretrazuju su name, city i country. S tim da name mora da se pretrazuje sa LIKE (% na kraju).
primer query stringa: inter
kao rezultat izbacuje (trenutno): Inter i Internacional
dok npr ovaj query: inter, brazil
izbacuje samo: Internacional
SQL upit kojim izvlacim se kontruise u PHP-u i za prvi primer izgleda ovako:
SELECT t.* FROM Team AS t WHERE ('inter' IN (t.country, t.city)) OR (t.name LIKE 'inter%') AND (t.status IN ('1')) LIMIT 0,10
visak zagrada i integer pod navodnicima su posledica Query Buildera koji (moram da) koristim...
za drugi upit je sql query ovakav:
SELECT t.* FROM Team AS t WHERE ('inter' IN (t.country, t.city)) OR (t.name LIKE 'inter%') AND ('brazil' IN (t.country, t.city)) OR (t.name LIKE 'brazil%') AND (t.status IN ('1')) LIMIT 0,10
posto je meni ovakav upit sumnjivo izgledao (po pitanju koriscenja indexa) uradio sam EXPLAIN:
mysql> EXPLAIN SELECT t.* FROM Team AS t WHERE ('inter' IN (t.country, t.city)) OR (t.name LIKE 'inter%') AND (t.status IN ('1')) LIMIT 0,10;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | t | ALL | name,status | NULL | NULL | NULL | 343 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
dakle, indeksi se ne koriste...
interesuje me da li neko ima ideju kako bih mogao da optimizujem ovo?
jedino sto meni pada na pamet to je da city i country izdvojim u dve tabele i da mi ta polja onda budu INT, to ce ubrzati pretragu, ali nisam siguran koliko...
hvala u napred