powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запросы почти одинаковые, а скорость работы разная, почему?
7 сообщений из 7, страница 1 из 1
Запросы почти одинаковые, а скорость работы разная, почему?
    #32417727
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не буду полностью расписывать все таблицы - они примитивные и большой рояли не играют. И интересуют две таблицы и их поведение при обычном SELECT'е.

Таблица PARTS (содержит около 2 млн записей):
- oenumid (int)
- oenum (char 30)
- tmid (int) PRI
- oenumsearch (char 30) PRI
- rabbatgroup (char 4)
- aboutpart(char 100)

Таблица PRICE (содержит около 4 млн записей):
- oenumid (int) PRI
- pricein (float)
- priceout (float)
- countdeliver (int)
- deliverid (int) PRI

Остальные таблицы примитивные из пары полей id и name. Теперь самое интересное

Запрос №1:
SELECT oenumid FROM parts WHERE oenumsearch='$part_number_wo_bs';

Запрос #2: SELECT parts.oenum, tm.tmname, price.pricein, price.priceret, price.countdeliver, deliver.delivername, parts.oenumid, parts.aboutpart FROM parts, price, tm, deliver WHERE parts.oenumsearch='$part_number_wo_bs' AND parts.oenumid=price.oenumid AND price.oenumid=parts.oenumid AND tm.tmid=parts.tmid AND deliver.deliverid=price.deliverid ORDER BY tm.tmname, parts.oenum ASC;

Запрос№1 обрабатывается больше 30 секунд!!!!!
Запрос №2 обрабатывается меньше секунды.....

Объясните мне - ламмеру, почему????? программирую совсем недавно, так что не судите строго за граммотность запросов и самого вопроса, как такового.

P.S. Я понимаю, что мало чего умею, но я хочу выучиться. Помогите, пожалуйста.

-------------------------------------------------------------
Артитсты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
Запросы почти одинаковые, а скорость работы разная, почему?
    #32417860
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы всегда можете набрать

explain вашзапрос

и получить план, по которому будет он выполняться.

Так что лучше привести тут эти explains и заодно то, что выдает show create table PARTS и
show create table PRICE
...
Рейтинг: 0 / 0
Запросы почти одинаковые, а скорость работы разная, почему?
    #32418241
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал команду EXPLAIN запрос 1 и EXPLAIN запрос 2. Я не понимаю, что дал мне результат... в мануалах четко расписаанного объяснения я не нашел. вот результаты, если сможете прокомментировать - буду признателен:

EXPLAIN SELECT oenumid FROM parts WHERE oenumsearch='$x';
+-------+------+---------------+------+---------+------+---------+------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+------+---------------+------+---------+------+---------+------------+
| parts | ALL | NULL | NULL | NULL | NULL | 3368545 | where used |
+-------+------+---------------+------+---------+------+---------+------------+
1 row in set <0.09sec>
EXPLAIN SELECT parts.oenum, tm.tmname, price.pricein, price.priceret, price.countdeliver, deliver.delivername, parts.oenumid, parts.aboutpart FROM parts, price, tm, deliver WHERE parts.oenumsearch='$х' AND price.oenumid=parts.oenumid AND tm.tmid=parts.tmid AND deliver.deliverid=price.deliverid ORDER BY tm.tmname, parts.oenum ASC

+---------+--------+---------------+---------+---------+---------------------------------+------+---------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+---------+--------+---------------+---------+---------+---------------------------------+------+---------------------------------+
| tm | ALL | PRIMARY | [NULL] | [NULL] | [NULL] | 756 | Using temporary; Using filesort |
| deliver | ALL | PRIMARY | [NULL] | [NULL] | [NULL] | 25 | |
| parts | eq_ref | PRIMARY | PRIMARY | 34 | tm.tmid,const | 1 | where used |
| price | eq_ref | PRIMARY | PRIMARY | 8 | parts.oenumid,deliver.deliverid | 1 | |
+---------+--------+---------------+---------+---------+---------------------------------+------+---------------------------------+
4 rows in set <0.04 sec>
EXPLAIN



--------------------------------------------------
Артитсты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
Запросы почти одинаковые, а скорость работы разная, почему?
    #32418415
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Комментирую: у тебя в первой таблице (очевидно) индекс по (tmid, oenumsearch). Он может быть использован только тогда, когда у тебя в запросе в WHERE используется поле tmid. В первом запросе оно не используется, во втором используется.

Можешь вместо него попробовать построить индекс по (oenumsearch, tmid) если tmid обычно без oenumsearch не используется. Или дополнительный только по oenumsearch в противном случае.
...
Рейтинг: 0 / 0
Запросы почти одинаковые, а скорость работы разная, почему?
    #32418453
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за подсказку.
Я уже тоже обнаружил, что я выдаю ключи двум полям, а ищу по одному.
Я не могу понять вот чего. Почему, когда я делаю запрос в виде SELECT oenumid FROM parts, tm Where oenumsearch='$x' AND tm.tmid=parts.tmid - то скорость поиска меньше секунды??? Я же ищу по одному полю, а вторым условием я привязываю вторую таблицу???
И вопрос номер два. Я прекрасно понимаю, что задам глупый вопрос, но опять же таки, я четко не знаю разницы между "ключем" и "индексом". Я так понимаю, что это разные вещи, а в чем конкретно разница - не знаю... и разъяснений по этому поводу я не видел... Если есть возможность - прошу провести ЛикБез...;((((
--------------------------------------------------
Артитсты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
Запросы почти одинаковые, а скорость работы разная, почему?
    #32427066
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тэкс.. Извините за задержку - меня не было в городе.
Итак: explain запроса номер 1:
сервер не видит ключей, которые он мог бы использовать и по простому перебирает все 3 с лишним миллиона записей.

Если это достаточно часто встречающийся запрос - я бы посоветовал создать отдельный индекс по oenumsearch, типа create index parts_ind1 on parts(oenumsearch) и попробовать скорость этого запроса опять

explain запроса номер 2:
все записи из таблицы tm (756 штук) запихиваются во временную таблицу и сортируются, потом для каждой записи делается перебор всех записей из deliver (25 записей на каждую запись из тм, всего 756*25 раз ) (обалдеть!), потом на каждую полученную запись прикручивается по первичному ключу запись из parts, и потому к этому всему прикурчивается по первичному ключу запись из price.

Explain-ы конечно ужасные. Если сказать по простому для запроса номер 2 как он есть, вы будете иметь гораздо более ужасные тормоза чем в первом запросе, как только таблицы deliver или (особенно) tm чуть чуть станут толще. Вам надо срочно создавать соотвествующие индексы для tm и deliver.

Для mysql key и index - практически синонимы. (разница только в синтаксисе)
...
Рейтинг: 0 / 0
Запросы почти одинаковые, а скорость работы разная, почему?
    #32427420
Фотография 4m@t!c
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Хрен
Большое спасибо за разъяснение. Я почти все понял. единственное не могу понять, как по несокльким полям эксплейна вы объяснили, как "думает" таблица???? если есть где-нить мануал по этому поводу и вы скините урлу - буду признателен...
---------------------------1------------------------
Хрен
сервер не видит ключей, которые он мог бы использовать и по простому перебирает все 3 с лишним миллиона записей.

Т.е. если я создал ключ по двум полям, то СУБД каким-то образом упорядочивает все именно по двум полям? Интересно, как????


---------------------------2------------------------
ХренExplain-ы конечно ужасные.
я понимаю, что опытные люди могут опредеить некорректность по одной манере написания имен переменных (и я так хочу;-)) ). я был бы признателен, если Вы объясните мне, в чем моя ошибка.


---------------------------3------------------------
ХренВам надо срочно создавать соотвествующие индексы для tm и deliver.
У меня таблица tm и deliver имеют по одному ключу. Зачем нужны еще индексы????
---------------------------------------------------------------
Мне говорили, что если создавать индексы, то нужно после каждого добавления новых полей в таблицу "убивать" и заново создавать индекс. Это так? Или нет? И очень интересно, как выглядит таблица индексов? оно похоже на стркутру "дерево"???

P.S. 2 Хрен
Большое спасибо за объяснение! Искренне признателен!!!
-----------------------------------------------
Артитсты не приехали, приехали цыгане
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запросы почти одинаковые, а скорость работы разная, почему?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]