SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.09.2009 22:48:17

gekakos
Участник
Зарегистрирован: 22.03.2009
Сообщений: 7

помогите ускорить поиск (2млн записей)

Подскажите, как оптимизировать поиск по полю VARCHAR(25)
Имеется таблица parts

CREATE TABLE `parts` (
  `id` int(11) NOT NULL auto_increment,
  `sclad` int(11) NOT NULL default '0',
  `code` varchar(25) NOT NULL,
  `cros` varchar(25) default NULL,
  `price` float NOT NULL,
  `count` int(11) NOT NULL default '1',
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `sclad` (`sclad`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

Записей порядка 2млн.
И таблица sclad
CREATE TABLE IF NOT EXISTS `sclad` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `address` text,
  `deliv` varchar(40) NOT NULL default '0',
  `sumdeliv` varchar(50) NOT NULL default '0',
  `notvisible` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8


Осуществляется поиск с присоединением доп. таблицы:
SELECT
 `parts`.`id`,
 `parts`.`sclad`,
 `parts`.`code`,
 `parts`.`cros`,  
 `parts`.`price`,
 `parts`.`count`,
 `sclad`.`title` `sclad`,
 `sclad`.`deliv`,
 `sclad`.`sumdeliv`
FROM `parts` INNER JOIN `sclad`
ON (`parts`.`sclad` = `sclad`.`id`)
WHERE (`parts`.`cros` IN ('CODE_1',...,'CONE_N') OR `parts`.`code` IN ('CODE_1',...,'CONE_N') OR `parts`.`cros`='CONE_C') AND `sclad`.`notvisible`=0  ORDER BY `parts`.`price` DESC LIMIT 500


где 'CODE_1',...,'CONE_N' - искомые ключи
количество ключей может быть от одного до 20
поиск по 5 ключам проходит за время 5 сек.
поиск по 15 ключам проходит за время 9 сек.
мне и заказчику это кажется плохим результатом
подскажите, как можно ускорить?

Неактивен

 

#2 16.09.2009 22:59:11

gekakos
Участник
Зарегистрирован: 22.03.2009
Сообщений: 7

Re: помогите ускорить поиск (2млн записей)

explain:

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1     SIMPLE     parts     ALL     sclad     NULL     NULL     NULL     2199566     Using where; Using filesort
1     SIMPLE     sclad     eq_ref     PRIMARY     PRIMARY     4     db.parts.sclad     1     Using where

Неактивен

 

#3 17.09.2009 11:18:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите ускорить поиск (2млн записей)

Попробуйте сделать индексы на code и cros

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson