Здесь курят мануал.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха переехала на новый сервер, ура!

Краснодарское время: 25 Май, 2012, 06:45:07

Страниц: [1] 2 3
Печать
Автор Тема: нешутоШный запрос  (Прочитано 462 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sweet15w    ↓ 
22 Ноябрь, 2011, 08:22:48
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 104
Сила слова: -0.96

есть две таблицы (mysql)...
 
viewer_checked ( 2,714 записей )
 
id | int auto_increment
surname | text
name | text
patronymic | text
organization | text
post | text
phone | text
email | text
activate | int
who | int
client | int
date_active | int
branch | int
 

 
subscription (13,326 записей)
 
id | int auto_increment
type | int
email | text
date | int
activate | int
date_active | int
 

написал запрос:
Text
(
    select distinct
          email,
          date_active
    from
          subscription
    where
          activate = '1'
    order by
           date_active,
           email
)
union
(
    select distinct
          email,
          date_active
    from
          viewer_checked
    where
          email not  in (
                 select distinct
                        email
                 from
                        subscription
                 where
                        activate = '1'
                 order by
                        date_active,
                        email
         ) and
         activate = '1'
    order by
          date_active,
          email
)
order by date_active, email

 
дк вот... на локальном компьютере phpmyadmin не может справиться с запросом... слабенький... а на серве выполняется, но за 30 секунд...
правда данная муть проходит раз в ночь... кроном... но есть ли какая нибудь возможность как то ускорить данный скрипт?? (((
Записан

отвечаю не в тему... за то редко...
artoodetoo    ↓ 
22 Ноябрь, 2011, 09:36:29 , спустя 1 час 13 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!

с особым цинизмом
Группа: в ухо

Карма: 124
Сообщений: 3805
Сила слова: 3.26

ты не написал назначение таблиц и что хочешь получить на выходе.
Записан
sweet15w    ↓ 
22 Ноябрь, 2011, 10:30:35 , спустя 54 минуты 6 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 104
Сила слова: -0.96

ну тут короч идет в первой таблице идут зарегистрированные клиенты
во второй email тех кто подписан на рассылку но не зарегистрирован ( причем есть 5 видов подписок, следовательно во второй таблице email может 5 раз повторяться (меняется type в зависимости от рассылки) )
 
выбираю все уникальные записи с первой таблицы и объединяю с уникальными записями второй с исключением повторов первой таблицы...
 
эта вся муть для расслыки... поэтому еще учитывается поле date_active - дата активности данного email.. когда он проверился... то происходит изменение даты активности... т.к. на хостинге разрешена отправка только 1000 писем в сутки... после 900 отправки писем происходит прерывание скрипта, в следующий день продолжается с того места, на котором был прерван скрипт...
Записан

отвечаю не в тему... за то редко...
Faster    ↓ 
22 Ноябрь, 2011, 11:13:41 , спустя 43 минуты 6 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 10
Сообщений: 954
Сила слова: 1.05

очень хуевая тема юзать SELECT во WHERE
Спустя 16 секунд добавил
больше так не делай
Записан

воспитываю дочь. С домами и деревьями  - не приставать.
artoodetoo    ↓ 
22 Ноябрь, 2011, 11:33:35 , спустя 19 минут 54 секунды
НЕ ХУЕТА! ХУЕТА!

с особым цинизмом
Группа: в ухо

Карма: 124
Сообщений: 3805
Сила слова: 3.26

что за activate = '1'  не рассказал. наверное флаг что почта высылалась. если так, то достаточно условия на дату.
не делай для строковых полей тип text. это blob поле и работает медленно по сравнению с varchar
 
главные тормоза конечно от not in select, хотя каждый distinct добавляет свои 5коп и бессмысленный order by в промежуточных запросах тоже
 

Спустя 1 минуту 1 секунду добавил
в целом говно то еще.
Записан
Nyaah    ↓ 
22 Ноябрь, 2011, 12:01:13 , спустя 27 минут 38 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

бд в третью нормальную форму приведи, и запросы упростятся и сущности дублироваться перестанут (DISTINCT не нужен будет) и таблицы места меньше станут занимать на диске/в памяти
Записан

Work, buy, consume, die
sweet15w    ↓ 
22 Ноябрь, 2011, 01:45:24 , спустя 1 час 44 минуты 11 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 104
Сила слова: -0.96

раньше запрос был выполнен за 35.4826 сек.
 
после того, как я убрал три лишнии сортировки запрос был выполнен за 40.7410 сек. :(
Text

(
    select distinct
          email,
          date_active
    from
          subscription
    where
          activate = '1'
)
union
(
    select distinct
          email,
          date_active
    from
          viewer_checked
    where
          email not  in (
                 select distinct
                        email
                 from
                        subscription
                 where
                        activate = '1'
         ) and
         activate = '1'
)
order by
    date_active,
    email

 
очень хуевая тема юзать SELECT во WHERE
я это понимаю... но как быть, у заказчика все время какие-то новые непонятные идеи... после которых и приходится идти на всякие извраты...
 
что за activate = '1'  не рассказал. наверное флаг что почта высылалась. если так, то достаточно условия на дату...
activate = '1' это активированные пользователи... так что не достаточно условия на дату...
 

не делай для строковых полей тип text. это blob поле и работает медленно по сравнению с varchar
после перевода text в varchar второй запрос выполнился за 33.1043 сек.,
 
а первый за 38.3414 сек.
 

 

бд в третью нормальную форму приведи, и запросы упростятся и сущности дублироваться перестанут (DISTINCT не нужен будет) и таблицы места меньше станут занимать на диске/в памяти
видимо так и сделаю...
Записан

отвечаю не в тему... за то редко...
phpdude    ↓ 
22 Ноябрь, 2011, 02:04:14 , спустя 18 минут 50 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: 20790
Сила слова: 1.66

Чуток подчистил запрос. Глянь такой возвращает теже результаты или другие получились? :)
 
тяжело без даных проверять, но судя по логике должно вернуть тоже.
 
SQL
(
    SELECT DISTINCT email, date_active
    FROM
          subscription
    WHERE activate = '1'
)
union
(
    SELECT DISTINCT v.email, v.date_active
    FROM viewer_checked v
    LEFT JOIN subscription s USING(email)
    WHERE s.id = NULL AND e.activate = 1 AND s.activate = 1
)
ORDER BY date_active, email

Чтобы работало быстро - надо с индексами поиграться. Данных тут немного, так что он в принцип за 0.5 максимум должен выполняться при должных условиях
Спустя 2 минуты 58 секунд добавил
зы: Для начала поле email в обоих таблицах должно быть индексируемым.
 
Предположительные индексы -
 
для Subscription
1. activate, email, date_active
2. email, id, activate, date_active
 
для viewer_checked
1. activate, email, date_active
 
Хотя по факту возможно хватит и первого индекса на оба случая, но не думаю)
 
Но без данных живых это только догадки :)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Ivan    ↓ 
22 Ноябрь, 2011, 03:00:06 , спустя 55 минут 52 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 27
Сообщений: 1366
Сила слова: 1.98

EXPLAIN тебе в помощь
Записан

phpdude    ↓ 
22 Ноябрь, 2011, 03:03:38 , спустя 3 минуты 32 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: 20790
Сила слова: 1.66


EXPLAIN тебе в помощь
Да, КЭП! :-)
 
он всем поможет)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
AlexB    ↓ 
22 Ноябрь, 2011, 04:18:08 , спустя 1 час 14 минут 30 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3428
Сила слова: 2.6


EXPLAIN тебе в помощь
Точно. Я уже устал возмущаться, что люди вместо того, чтобы просто взять и посмотреть план, предпочитают гадать на кофейной куще, да еще привлечь к этому гаданию целый форум. )))))
Записан

master    ↓ 
22 Ноябрь, 2011, 05:31:01 , спустя 1 час 12 минут 53 секунды
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

люди вместо того, чтобы просто взять и посмотреть план
может ещё мануал почитать, лол
Записан

artoodetoo    ↓ 
22 Ноябрь, 2011, 08:25:58 , спустя 2 часа 54 минуты 57 секунд
НЕ ХУЕТА! ХУЕТА!

с особым цинизмом
Группа: в ухо

Карма: 124
Сообщений: 3805
Сила слова: 3.26

всем: не поймет он результатов explain
 
топикстартеру: у тебя несколько видов подписок для незарегистрированных, а для пользователей получается нет разбивки. что-то тут не так. логика хромает.
1) полноценные пользователи должны аналогично попадать в таблицу "подписка" и получишь один простой запрос
2) чтобы выборка уникальных email была быстрой, сделай его символьным и индексируй его.
будет работать доли секунды
 
30 или 40 сек: я думаю реально у тебя разброс +- 50% по времени, так что такие наблюдения ниочем. наведи порядок кардинально
 
« Последнее редактирование: 22 Ноябрь, 2011, 08:25:58 от artoodetoo » Записан
phpdude    ↓ 
22 Ноябрь, 2011, 08:36:35 , спустя 10 минут 37 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: д-о-х-у-я!
Сила слова: 1.66

2) чтобы выборка уникальных email была быстрой, сделай его символьным и индексируй его.
char(50)  будет более чем достаточно :-)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Faster    ↓ 
22 Ноябрь, 2011, 10:36:18 , спустя 1 час 59 минут 43 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: 10
Сообщений: 954
Сила слова: 1.05

varchar медленнее?
Записан

воспитываю дочь. С домами и деревьями  - не приставать.
Страниц: [1] 2 3
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd