![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
DCoder |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 1.3.2006 Где: Самара Репутация: нет Всего: нет |
Доброго времени суток!
У меня имеется 2 таблицы: элементы и значения свойств этих элементов.
Хочу отсортировать по полю присоединённой таблицы:
Задумывается очень-очень крепко... Вот, что говорит explain:
Подскажите пожалуйста, как оптимизировать? |
||||||
|
|||||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
DCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 1.3.2006 Где: Самара Репутация: нет Всего: нет |
Akina,
Пробовал - 51 сек. ![]()
|
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
А если в поддающихся сравнению единицах? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
DCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 1.3.2006 Где: Самара Репутация: нет Всего: нет |
||||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Не эквивалентно же!!! Попробуйте составной индекс по properties (property_id,value) И если он сам не поймет в какой последовательности правильно джойнить - попробуйте определить порядок соединения непосредственно в запросе. /*к сожалению я не знаю как подсказать масиному оптимизаторов, что последовательность жойнов следует выдержать именно в порядке, определенном запросом*/
Это сообщение отредактировал(а) Zloxa - 5.9.2010, 13:16 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Да как обычно - расставить скобки. угу, есть такое -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Я это к тому, что Оракля, к примеру, чхал на скобки, для него хинтовать приходится, чтоб он этого не делал ;) А как дела в масе обстаят, ей богу не знаю. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
DCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 1.3.2006 Где: Самара Репутация: нет Всего: нет |
Zloxa, 14.31255 сек.
EXPLAIN:
Если я не ошибаюсь, то сортировать, используя индекс, он не будет, потому что поле value имеет тип TEXT. Как-нибудь можно избавиться от filesort? А нескромный вопрос... Почему не эквивалентно? Это сообщение отредактировал(а) DCoder - 5.9.2010, 16:17 |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
К сожалению я так и не научился читать масин эксплайн. Индекс какой используется - ind_prop_pid_value? Похоже - да. потому что критерии отбора перенесены в критерии объединения. Запрос, переписанный Akina вернет ВСЕ элементы, а Ваш только те, для которых определены свойства.
тут не знаю. Весьма вероятно. пусть знающие подскажут. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
DCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 1.3.2006 Где: Самара Репутация: нет Всего: нет |
Заменил тип данных поля value с TEXT на varchar(255) - время выполнения скрипта 0.19693 сек.
EXPLAIN:
Но! Стоит увеличить длину varchar(500), как индекс уже не используется, и возвращается filesort. Кто-нибудь может внести ясность? |
|||
|
||||
Zloxa |
|
||||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
не связано ли это с ограничением длины строки, хранимой в индексе?
тут. Если индекс хранит не строку целиком, а лишь ее префикс, индекс не может быть использован для сортировки. ЗЫ И, конечно, я проглядел что у Вас value имеет тип TEXT. Для меня наличие необходимости сортировки по значению поля этого типа - разрыв шаблона. Быть может стоит подумать о суррогатном поле, которое хранило бы префикс строки, заполнялось бы из триггера, было бы проиндексировано и использовалось бы для сортировки? Это сообщение отредактировал(а) Zloxa - 6.9.2010, 11:19 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
||||
|
|||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
а что, кстати означает text(10)?
1) что поле вмещает лишь 10 символов 2) что в таблице хранятся первые 10 символов, а остальные хранятся гдето с боку -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Ни то, ни другое. Это означает, что следует использовать наименьший из типов семейства TEXT, который вмещает указанное количество символов. В данном случае это будет TINYTEXT, макс. длина которого 255 символов. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
DCoder |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 1.3.2006 Где: Самара Репутация: нет Всего: нет |
Zloxa,
Akina, Извиняюсь за долгое отсутствие! Структура немного изменилась, и я думал, что уже вроде всё заработало, но тут у меня возник вообще ступор ![]() Может сегодня я уже заработался или звёзды не так сошлись... Создаю уже такой дубовый пример:
Вот что заявляет мне explain:
Возможных ключей нет, и ключ не используется!!! Как это понимать? Я уже несколько часов с ним воюю... Если подставить FORCE INDEX (ind_int_field1), то он его будет использовать, но если попробовать к этой таблице присоединить какую-нибудь другую, то даже FORCE INDEX ему не указ. |
||||
|
|||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Далеко не всегда доступ по индексу более выгоден нежели полное сканирование таблицы и далеко не всегда можно использовать индексный доступ. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
DCoder, добавь миллион записей. И тогда индекс будет использоваться.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
DCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 1.3.2006 Где: Самара Репутация: нет Всего: нет |
Akina,
У меня не то, чтобы миллион, но 300 000, я думаю, достаточно. А в possible keys он разве не должен быть в любом случае? Ещё одно наблюдение: если добавить какое-нибудь условие в WHERE по данному полю, то сразу подключается индекс. Хороший вариант. Но я конвертировал данное поле в varchar(30) и создал индекс по всей длине. Примерно то же самое получил, но когда стоит один ORDER BY без каких-либо ограничений в WHERE, индекс не цепляется.
С этим полностью согласен, а насчёт можно поподробнее? ![]() Это сообщение отредактировал(а) DCoder - 11.9.2010, 00:05 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
C чего бы? оптимизатор - не идиот. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
это ответ на
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
DCoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 1.3.2006 Где: Самара Репутация: нет Всего: нет |
Аааа... У меня мой бредогенератор вставлял в запрос SQL_CALC_FOUND_ROWS - я про него совсем забыл. Поэтому индекс и не использовался.
Всем спасибо за помощь! ![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |