|
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
написал запрос:
(
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 сек. :(
(
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
|
Чуток подчистил запрос. Глянь такой возвращает теже результаты или другие получились? :)
тяжело без даных проверять, но судя по логике должно вернуть тоже.
(
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 медленнее?
|
|
|
|
|
Записан
|
воспитываю дочь. С домами и деревьями - не приставать.
|
|
|
|