|
Запросы почти одинаковые, а скорость работы разная, почему?
|
|||
---|---|---|---|
#18+
Не буду полностью расписывать все таблицы - они примитивные и большой рояли не играют. И интересуют две таблицы и их поведение при обычном 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. Я понимаю, что мало чего умею, но я хочу выучиться. Помогите, пожалуйста. ------------------------------------------------------------- Артитсты не приехали, приехали цыгане ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2004, 14:04 |
|
Запросы почти одинаковые, а скорость работы разная, почему?
|
|||
---|---|---|---|
#18+
вы всегда можете набрать explain вашзапрос и получить план, по которому будет он выполняться. Так что лучше привести тут эти explains и заодно то, что выдает show create table PARTS и show create table PRICE ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2004, 20:31 |
|
Запросы почти одинаковые, а скорость работы разная, почему?
|
|||
---|---|---|---|
#18+
Сделал команду 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 -------------------------------------------------- Артитсты не приехали, приехали цыгане ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2004, 10:58 |
|
Запросы почти одинаковые, а скорость работы разная, почему?
|
|||
---|---|---|---|
#18+
Комментирую: у тебя в первой таблице (очевидно) индекс по (tmid, oenumsearch). Он может быть использован только тогда, когда у тебя в запросе в WHERE используется поле tmid. В первом запросе оно не используется, во втором используется. Можешь вместо него попробовать построить индекс по (oenumsearch, tmid) если tmid обычно без oenumsearch не используется. Или дополнительный только по oenumsearch в противном случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2004, 15:03 |
|
Запросы почти одинаковые, а скорость работы разная, почему?
|
|||
---|---|---|---|
#18+
Спасибо за подсказку. Я уже тоже обнаружил, что я выдаю ключи двум полям, а ищу по одному. Я не могу понять вот чего. Почему, когда я делаю запрос в виде SELECT oenumid FROM parts, tm Where oenumsearch='$x' AND tm.tmid=parts.tmid - то скорость поиска меньше секунды??? Я же ищу по одному полю, а вторым условием я привязываю вторую таблицу??? И вопрос номер два. Я прекрасно понимаю, что задам глупый вопрос, но опять же таки, я четко не знаю разницы между "ключем" и "индексом". Я так понимаю, что это разные вещи, а в чем конкретно разница - не знаю... и разъяснений по этому поводу я не видел... Если есть возможность - прошу провести ЛикБез...;(((( -------------------------------------------------- Артитсты не приехали, приехали цыгане ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2004, 15:44 |
|
Запросы почти одинаковые, а скорость работы разная, почему?
|
|||
---|---|---|---|
#18+
Тэкс.. Извините за задержку - меня не было в городе. Итак: 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 - практически синонимы. (разница только в синтаксисе) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2004, 20:48 |
|
Запросы почти одинаковые, а скорость работы разная, почему?
|
|||
---|---|---|---|
#18+
2 Хрен Большое спасибо за разъяснение. Я почти все понял. единственное не могу понять, как по несокльким полям эксплейна вы объяснили, как "думает" таблица???? если есть где-нить мануал по этому поводу и вы скините урлу - буду признателен... ---------------------------1------------------------ Хрен сервер не видит ключей, которые он мог бы использовать и по простому перебирает все 3 с лишним миллиона записей. Т.е. если я создал ключ по двум полям, то СУБД каким-то образом упорядочивает все именно по двум полям? Интересно, как???? ---------------------------2------------------------ ХренExplain-ы конечно ужасные. я понимаю, что опытные люди могут опредеить некорректность по одной манере написания имен переменных (и я так хочу;-)) ). я был бы признателен, если Вы объясните мне, в чем моя ошибка. ---------------------------3------------------------ ХренВам надо срочно создавать соотвествующие индексы для tm и deliver. У меня таблица tm и deliver имеют по одному ключу. Зачем нужны еще индексы???? --------------------------------------------------------------- Мне говорили, что если создавать индексы, то нужно после каждого добавления новых полей в таблицу "убивать" и заново создавать индекс. Это так? Или нет? И очень интересно, как выглядит таблица индексов? оно похоже на стркутру "дерево"??? P.S. 2 Хрен Большое спасибо за объяснение! Искренне признателен!!! ----------------------------------------------- Артитсты не приехали, приехали цыгане ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2004, 11:14 |
|
|
start [/forum/topic.php?fid=47&msg=32418415&tid=1855375]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
63ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 324ms |
total: | 489ms |
0 / 0 |