Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация подзапроса / 8 сообщений из 8, страница 1 из 1
07.04.2016, 23:50
    #39210630
mnbcz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация подзапроса
Существует запрос который работает очень долго 20 секунд из за подзапроса.


SELECT `kv`.*, (SELECT COUNT(*) FROM kvartiri pk WHERE (pk.telefon = kv.telefon OR pk.telefon = kv.telefon_content OR pk.telefon = kv.telefon_content2 OR pk.telefon_content = kv.telefon OR pk.telefon_content = kv.telefon_content OR pk.telefon_content = kv.telefon_content2 OR pk.telefon_content2 = kv.telefon OR pk.telefon_content2 = kv.telefon_content OR pk.telefon_content2 = kv.telefon_content2) AND kv.is_active >= 1 ) AS `num_dublikat` FROM `kvartiri` AS `kv` ORDER BY `kv`.`date_add_base` DESC

Этот скрипт выбрает все записи из базы в котором считается число дубликатов телефона, тоесть для каждой записи на сайте выводится ссылка "дубликатов (10)"

Тормозит запрос вот эта строка: (SELECT COUNT(*) FROM kvartiri pk WHERE ......
Может есть возможность сделать выборку быстрее ?
...
Рейтинг: 0 / 0
08.04.2016, 01:00
    #39210638
Оптимизация подзапроса
Нужна отдельная таблица для хранения данных о количестве. Если SELECT COUNT(*) может давать большие числа, то быстрым его никак не сделать.
...
Рейтинг: 0 / 0
08.04.2016, 01:46
    #39210646
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация подзапроса
mnbcz,

Пользуйтесь специальными тэгами для оформления постов. Невозможно же читать!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT `kv`.*,
 (SELECT COUNT(*) 
  FROM kvartiri pk 
  WHERE (pk.telefon = kv.telefon
          OR pk.telefon = kv.telefon_content 
          OR pk.telefon = kv.telefon_content2 
          OR pk.telefon_content = kv.telefon 
          OR pk.telefon_content = kv.telefon_content 
          OR pk.telefon_content = kv.telefon_content2 
          OR pk.telefon_content2 = kv.telefon 
          OR pk.telefon_content2 = kv.telefon_content 
          OR pk.telefon_content2 = kv.telefon_content2) 
          AND kv.is_active >= 1 
  ) AS `num_dublikat` 
FROM `kvartiri` AS `kv` 
ORDER BY `kv`.`date_add_base` DESC
...
Рейтинг: 0 / 0
08.04.2016, 01:52
    #39210649
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация подзапроса
mnbcz,

Надо избавляться от кучи OR-ов.
Я бы предложил телефоны вынести в отдельную таблицу в одно поле.
...
Рейтинг: 0 / 0
08.04.2016, 03:53
    #39210663
Оптимизация подзапроса
mnbcz,

Скалярный коррелированный подзапрос нужно переписать в форму деривед табле
...
Рейтинг: 0 / 0
08.04.2016, 07:31
    #39210687
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация подзапроса
mnbcz,

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

редизайн.
...
Рейтинг: 0 / 0
08.04.2016, 07:36
    #39210690
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация подзапроса
miksoftmnbcz,

Надо избавляться от кучи OR-ов.
Я бы предложил телефоны вынести в отдельную таблицу в одно поле.


да не только это, у него же основной запрос вообще без фильтра, ВСЕ записи, и еще потом на каждую - дубликаты с кореляцией по OR.

производительность обратнопропорциональна квадрату числа записей в этой таблице.
не заработает никогда.
...
Рейтинг: 0 / 0
08.04.2016, 19:56
    #39211448
mnbcz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация подзапроса
MasterZiv, авторСкалярный коррелированный подзапрос нужно переписать в форму деривед табле

Не совсем понятно, что именно нужно, можно пример sql
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация подзапроса / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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