Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть две таблицы `company` и `company_category`, у одной компании может быть несколько категорий т.е. обычная many-to-many. Строк 4 млн и 6,5 млн соответственно. Проблема в том, что запрос, например, когда мне нужно найти организации по категории, городу и статусу, выполняется медленно: Код: sql 1. 2. 3. 4. может выполняться от 1 до 10 секунд, что, конечно же, для меня неприемлемо. EXPLAIN вроде бы в норме: Код: sql 1. 2. 3. 4. 5. 6. Обычно запросы занимали у меня тысячные или сотые секунды, правда без джоинов и по индексам. Хочу выяснить: это все-таки уже ограничения оборудования (пробовал и на сервере с 2GB RAM, и на локале с 4GB) или что-то настроено не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 11:51 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Дополню, что 99.9% согласно профилированию занимает Sending Data. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 11:58 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Dimec, Сколько записей выдает этот запрос? Какие числа выдадут следующие запрорсы: Код: sql 1. Код: sql 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 12:17 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Добавьте ещё DDL таблиц, видеть какие индексы уже есть. Попробуйте с индексами company по status & location_id, company_category по category_id & company_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 12:27 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
miksoft, Запрос из моего начального поста находит 895 строк. Первый из вашего: 403329 Второй из вашего: 10391 Melkij, Разумеется все возможные индексы расставлены, я уже как только ими не жонглировал, кардинально ничего не меняется. Причем если отдельно выбирать, например, компании по location_id и status, и отдельно company_category по category_id, то все происходит если не моментально, то с адекватным временем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 13:04 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Dimec, А зачем вам все возможные индексы? Нужны вполне определённые. Эти два индекса, которые я предлагаю, должны эффективно фильтровать ваш запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 13:22 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Melkij, Имел в виду возможные из необходимых. Еще раз проверил с вашими индексами - ничего не изменилось. Все-таки кто-нибудь может сказать по своему опыту: с учетом всех цифр ситуация с таким временем запроса все-таки норма или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 13:47 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
DimecЕще раз проверил с вашими индексами - ничего не изменилось.Показывайте полностью DDL таблиц, включая свежесозданные индексы, и новый план запроса. Кстати, после создания индексов не забывайте делать ANALYZE TABLE для используемых таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 15:15 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
miksoft, Да, спасибо, немножечко изменил индексы, раньше на время разработки в company id был не первичным, а unique. Но существенно ничего не поменялось, выполняется долго. Вот, смотрите пожалуйста: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Для запроса: Код: sql 1. 2. 3. 4. 5. Explain такой: Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 18:06 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Dimec на сервере с 2GB RAM зачем в 2017 году люди называют это сервером? Все такие сервера давно выведены из эксплуатации. У вас VPS с той или иной формой разделения ресурсов ввода-вывода. Характеристики этого разделения могут быть самые разнообразные Но это не значит, что нет смысла критически подходить к структуре и планам выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 18:49 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Dimec. Хочу выяснить: это все-таки уже ограничения оборудования (пробовал и на сервере с 2GB RAM, и на локале с 4GB) или что-то настроено не так? тут у тебя, как видно сходу, будет проблема, как я ее называю, распределенной селективности. (термин мой) У тебя есть SARG из трех полей, допустим, все вместе они дают хорошую селективность, т. е. отфильтровывают много записей, и возвращают мало. Это хорошо. Но одно поле у тебя в одной таблице, а два других - в другой, индекс не построить на все три поля. А два оставшихся в одной таблице уже могут не давать такую хорошую селективность, индекс будет неэффективен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 22:57 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Dimecmiksoft, Запрос из моего начального поста находит 895 строк. Первый из вашего: 403329 Второй из вашего: 10391 . во, налицо она, описанная мной проблема. в общем она не решается, тем более, что у тебя там many-to-many, а не 1 к N. решается она вводом дополнительных критериев поиска на application уровне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 23:03 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Dimec. Причем если отдельно выбирать, например, компании по location_id и status, и отдельно company_category по category_id, то все происходит если не моментально, то с адекватным временем. это ты ошибаешься, тебе так кажется, потому что ты не выполняешь весь запрос, а только выбираешь первые несколько сот записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 23:06 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
MelkijПопробуйте с индексами company по status & location_id, company_category по category_id & company_id оба эти индекса одновременно никогда работать не будут, либо один, либо другой, в этом и вся проблема. нужно либо делать функциональный индекс в таблице категорий компаний на все три поля, но mySQL это не умеет, либо денормализовать данные, протащить status и location_id из company в company_category, и там по всем тем строить индекс, и соответственно переписать запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 23:15 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
MasterZivтут у тебя, как видно сходу, будет проблема, как я ее называю, распределенной селективности. (термин мой) У тебя есть SARG из трех полей, допустим, все вместе они дают хорошую селективность, т. е. отфильтровывают много записей, и возвращают мало. Это хорошо. Но одно поле у тебя в одной таблице, а два других - в другой, индекс не построить на все три поля. А два оставшихся в одной таблице уже могут не давать такую хорошую селективность, индекс будет неэффективен. Да, в этом и проблема. MasterZivнужно либо делать функциональный индекс в таблице категорий компаний на все три поля, но mySQL это не умеет, либо денормализовать данные, протащить status и location_id из company в company_category, и там по всем тем строить индекс, и соответственно переписать запрос. Собственно собирался так делать, но потом подумал что получается какая-то ерунда с избыточностью данных, а не каноничная many-to-many, и решил спросить на форуме. Но раз не мне одному пришла такая мысль, видимо стоит подумать в этом направлении. Большое спасибо всем за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 23:35 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Dimec, 0) key_buffer_size у вас сколько? 1) Создайте индекс `company`(`id`, `status`, `location_id`). В порядке полей тут я не уверен, но, по идее, существенной разницы он дать не должен, если key_buffer_size достаточен. 2) Сделайте ANALYZE TABLE для обеих таблиц. 3) Попробуйте несколько раз выполнить такой запрос (именно такой, без изменений): Код: sql 1. 2. 3. 4. 5. Какое будет время выполнения и план запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 23:52 |
|
||
|
Подскажите по медленному JOIN: проблема оптимизации или железа?
|
|||
|---|---|---|---|
|
#18+
Dimec[quot Собственно собирался так делать, но потом подумал что получается какая-то ерунда с избыточностью данных, а не каноничная many-to-many, и решил спросить на форуме. Но раз не мне одному пришла такая мысль, видимо стоит подумать в этом направлении. Большое спасибо всем за помощь! ну, Денормализация - это всегда избыточность данных. главное чтобы были непротиворечивы. Можно еще как-то навестить все эти категории на компании, сделать из них поле в виде массива и по нему полнотекстовый индекс с поиском, но туда надо будет еще и остальные два поля пихать. еще вариант - выделить одну главную категорию компании и пронести ее в таблицу компании, и искать только по ней. но это меняет постановку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2017, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39387235&tid=1830983]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 385ms |

| 0 / 0 |
