SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 11.04.2011 16:00:52

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Помогите оптимизировать таблицу и запросы к ней!!!

Привет всем!
Нужно оптимизировать таблицу и запросы к ней. Суть проблемы в следующем: Таблица прайсов. По ней ищутся запчасти за критерием номер запчасти и название запчасти. Таблица содержит огромное кол-во строк свыше 5 мил.

в переменной $kod содержится код запчасти.
В скриншотах отправляю структуру и содержание самой таблицы.


Есть запрос:

$query = mysql_query("SELECT
prices.marka as marka,
prices.numberKatalog as numberKatalog,
prices.nomenklatura as nomenklatura,
prices.price as price,
prices.presence as presence,
prices.deliveryDate as deliveryDate,
prices.idUser as idUser,
users.sitename as sitename,
users.company as company
FROM
prices,
users,
pricesTested
WHERE
prices.numberKatalog LIKE '$kod%' and
prices.idUser = users.id_USER and
prices.idUser = pricesTested.idUser and
pricesTested.tested = 1
LIMIT $start,$itemsperpage");

Этот запрос на выборку работает но очень медленно! Может кто-либо из Вас сможет подрихтовать саму таблицу (индексы, типы полей и прочие), а также содержание самого запроса!
Буду признателен за любую помощь! Спасибо!

Отредактированно yuriy (11.04.2011 16:01:55)


Прикрепленные файлы:
Attachment Icon 1.jpg, Размер: 266,689 байт, Скачано: 449

Неактивен

 

#2 11.04.2011 16:03:22

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

А это структура таблицы

Отредактированно yuriy (11.04.2011 16:03:45)


Прикрепленные файлы:
Attachment Icon 2.jpg, Размер: 198,343 байт, Скачано: 451

Неактивен

 

#3 11.04.2011 16:07:00

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

yuriy написал:

Этот запрос на выборку работает но очень медленно! Может кто-либо из Вас сможет подрихтовать саму таблицу (индексы, типы полей и прочие), а также содержание самого запроса!

Ну для начала нужно знать какие у вас индексы, типы полей и прочее smile

Покажите результат show create table `имя таблицы`; для всех 3ех использующихся таблиц, а также explain ваш запрос;

И почему у вас код запчасти ищется через like, а не через равенство?

Неактивен

 

#4 11.04.2011 16:26:21

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Для табл. prices:

CREATE TABLE `prices` (\n  `id` int(11) NOT NULL auto_increment,\n  `number` int(11) default NULL,\n  `marka` varchar(100) default NULL,\n  `numberKatalog` varchar(100) default NULL,\n  `nomenklatura` text,\n  `amount` int(20) default NULL,\n  `price` float default NULL,\n  `presence` char(100) default NULL,\n  `deliveryDate` char(100) NOT NULL,\n  `idUser` smallint(20) default '0',\n  PRIMARY KEY  (`id`),\n  KEY `idUser` (`idUser`),\n  KEY `number` (`marka`(20),`numberKatalog`(20),`nomenklatura`(30))\n) ENGINE=MyISAM AUTO_INCREMENT=4242222 DEFAULT CHARSET=cp1251

Для табл. users:
CREATE TABLE `users` (\n  `id_USER` int(11) NOT NULL auto_increment,\n  `name` varchar(50) NOT NULL,\n  `company` varchar(50) NOT NULL,\n  `region` int(10) NOT NULL,\n  `lawyeradres` varchar(150) default NULL,\n  `email` varchar(30) NOT NULL,\n  `pass` varchar(20) NOT NULL,\n  `passagein` varchar(20) NOT NULL,\n  `phone` varchar(40) NOT NULL,\n  `phoneother` varchar(40) NOT NULL,\n  `sitename` varchar(30) NOT NULL,\n  PRIMARY KEY  (`id_USER`),\n  KEY `email` (`email`)\n) ENGINE=MyISAM AUTO_INCREMENT=655 DEFAULT CHARSET=cp1251

Для табл. pricesTested
CREATE TABLE `pricesTested` (\n  `id` int(11) NOT NULL auto_increment,\n  `idUser` int(11) NOT NULL,\n  `tested` int(11) NOT NULL default '0',\n  PRIMARY KEY  (`id`),\n  UNIQUE KEY `idUser` (`idUser`),\n  KEY `tested` (`tested`)\n) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=cp1251

explain запрос в скриншоте!
like - использую потому что поиск может быть к примеру по трьом первым цыфрам или буквам тоисть чтобы не было четкой привязки (к примеру пользователь ввел 156FG ему выдаст весть перечень товаров которые начинаются на это значение)


Прикрепленные файлы:
Attachment Icon 3.jpg, Размер: 85,605 байт, Скачано: 473

Неактивен

 

#5 11.04.2011 16:57:05

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

А если искать не по первой букве, а по 3ем первым, explain такой же будет ?

Неактивен

 

#6 11.04.2011 17:03:07

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Вот что получается если искать по 3-м первым буквам (скриншот). В принцепе одно и тоже!


Прикрепленные файлы:
Attachment Icon 4.jpg, Размер: 102,391 байт, Скачано: 491

Неактивен

 

#7 11.04.2011 17:33:53

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Попробуйте ANALYZE TABLE http://dev.mysql.com/doc/refman/5.5/en/ … table.html
а то у вас, что для 1го, что для 3ех символов результат одинаковый.

Проблема в том, что по like у вас выбирается больше сотни тысяч строк. Очевидно, что пользователю столько не нужно.

Можно, если пользователь вводит не полный код, а первые символы, использовать не указанный запрос, а другой - сначала выбирать из prices первые несколько десятков id, соответствующих указанному коду, а по ним уже выбирать всё остальное.

Неактивен

 

#8 11.04.2011 17:44:01

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Так что Вы мне предлагаете: вместо LIKE использовать другой оператор сопоставления? Какой?
Можно, если пользователь вводит не полный код, а первые символы, использовать не указанный запрос, а другой - сначала выбирать из prices первые несколько десятков id, соответствующих указанному коду, а по ним уже выбирать всё остальное. - объясните поподробней, плиз!!!

Неактивен

 

#9 11.04.2011 18:13:10

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Погарячился я, так просто не получиться sad

Тогда так:
Если пользователь вводит полный код - вы используете свой запрос, заменив like на равенство.
Если пользователь вводит почти полный код (без нескольких последних символов), который даст разумное число совпадений - вы используете свой запрос с like.
Если пользователь вводит не полный код, а первые символы, то вы сначала используете доп таблицу, в которой у вас храниться id из прайса, код и ключи на первый символ кода, первые два символа и т.д. По этой таблице, зная первые несколько символов кода, вы выбираете нужное вам число id.
Затем ищите нужную вам информацию из трех таблиц по найденным в предыдущем запросе id.

Неактивен

 

#10 11.04.2011 18:21:05

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

А как мне узнать что вписал пользователь для критерия поиска: (полный код или почти полный или не полній - всего 3 символа)??? И что такое дополнительная таблица и как ее формировать?

Неактивен

 

#11 11.04.2011 18:27:39

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

yuriy написал:

А как мне узнать что вписал пользователь для критерия поиска: (полный код или почти полный или не полній - всего 3 символа)???

Откуда-то у вас берется переменная $kod, вот там и анализировать сколько символов ввел пользователь.


yuriy написал:

И что такое дополнительная таблица и как ее формировать?

Обычная таблица,которую вы ввели дополнительно к имеющимся, чтобы оптимизировать выполнение своего запроса. С помощью create table

Неактивен

 

#12 11.04.2011 18:37:32

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

vasya написал:

yuriy написал:

А как мне узнать что вписал пользователь для критерия поиска: (полный код или почти полный или не полній - всего 3 символа)???

Откуда-то у вас берется переменная $kod, вот там и анализировать сколько символов ввел пользователь.


yuriy написал:

И что такое дополнительная таблица и как ее формировать?

Обычная таблица,которую вы ввели дополнительно к имеющимся, чтобы оптимизировать выполнение своего запроса. С помощью create table

Код запчасти может сосотоять из 5, 10, 15 ( к примеру 1102-565656, 110221 - 5400011, XVV65041301 и т.д.) символов, и наверника точно знать соответствие полного наименования - невозможно. Проанализировать переменную $kod можно, а вот определить соответствует ли она полному названию или частичному - невозможно!!! Поэтому сдесь нужен какой-то другой метод опредиления...

Неактивен

 

#13 11.04.2011 19:13:22

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Так больше нет никаких предожений чтобы оптимизировать даный запрос?

Неактивен

 

#14 11.04.2011 19:56:24

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Добавьте индекс на `numberKatalog`
alter table `prices` add index(`numberKatalog`);

Неактивен

 

#15 11.04.2011 20:22:26

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Добавил! Ну а как и запросом поступать? Нужно в нем избавлятся о LIKE?

Неактивен

 

#16 11.04.2011 20:24:19

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

что теперь показывает explain?

Неактивен

 

#17 11.04.2011 20:29:35

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Вот индексы установлены для полей! (скриншот)


Прикрепленные файлы:
Attachment Icon 1.jpg, Размер: 171,404 байт, Скачано: 447

Неактивен

 

#18 11.04.2011 20:30:56

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

а вот EXPLAIN (скриншот)

Отредактированно yuriy (11.04.2011 20:31:23)


Прикрепленные файлы:
Attachment Icon 2.jpg, Размер: 68,348 байт, Скачано: 414

Неактивен

 

#19 11.04.2011 20:40:46

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

yuriy написал:

Вот индексы установлены для полей! (скриншот)

Что-то я не вижу здесь индекса на `numberKatalog`

Что показывает
show create table `prices`;

Неактивен

 

#20 11.04.2011 20:42:13

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

CREATE TABLE `prices` (\n  `id` int(11) NOT NULL auto_increment,\n  `number` int(11) default NULL,\n  `marka` varchar(100) default NULL,\n  `numberKatalog` varchar(100) default NULL,\n  `nomenklatura` text,\n  `amount` int(20) default NULL,\n  `price` float default NULL,\n  `presence` char(100) default NULL,\n  `deliveryDate` char(100) NOT NULL,\n  `idUser` smallint(20) default '0',\n  PRIMARY KEY  (`id`),\n  KEY `idUser` (`idUser`),\n  KEY `number` (`marka`(20),`numberKatalog`(20),`nomenklatura`(30))\n) ENGINE=MyISAM AUTO_INCREMENT=4242222 DEFAULT CHARSET=cp1251

Неактивен

 

#21 11.04.2011 20:44:42

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Вот последнее:
CREATE TABLE `prices` (\n  `id` int(11) NOT NULL auto_increment,\n  `number` int(11) default NULL,\n  `marka` varchar(100) default NULL,\n  `numberKatalog` varchar(100) default NULL,\n  `nomenklatura` text,\n  `amount` int(20) default NULL,\n  `price` float default NULL,\n  `presence` char(100) default NULL,\n  `deliveryDate` char(100) NOT NULL,\n  `idUser` smallint(20) default '0',\n  PRIMARY KEY  (`id`),\n  KEY `idUser` (`idUser`),\n  KEY `number` (`marka`(20),`numberKatalog`(20),`nomenklatura`(30)),\n  KEY `numberKatalog` (`numberKatalog`)\n) ENGINE=MyISAM AUTO_INCREMENT=4242222 DEFAULT CHARSET=cp1251

Неактивен

 

#22 11.04.2011 20:46:41

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

А последний explain был старый или новый?

Неактивен

 

#23 11.04.2011 20:49:08

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Вот это есть последний EXPLAIN


Прикрепленные файлы:
Attachment Icon 4.jpg, Размер: 88,842 байт, Скачано: 441

Неактивен

 

#24 11.04.2011 20:51:55

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

Re: Помогите оптимизировать таблицу и запросы к ней!!!

Хорошо, пойдем другим путем. Сколько будет
select count(*) from prices where numberKatalog like'A%';

Неактивен

 

#25 11.04.2011 20:54:32

yuriy
Завсегдатай
Зарегистрирован: 24.10.2010
Сообщений: 76

Re: Помогите оптимизировать таблицу и запросы к ней!!!

1013859

Неактивен

 

Board footer

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