PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (289): « 1 2 [3] 4 5 6 7 8 9 ... » В конец

> Найдено сообщений: 4334
Champion Отправлено: 11 Июня, 2013 - 11:59:58 • Тема: Оптимизация запроса SQL • Форум: SQL и Архитектура БД

Ответов: 8
Просмотров: 53
Можно попробовать так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DISTINCT  
  2.                 d.id,
  3.                 d.order_id,
  4.                 o.order_total/cntAll AS price,
  5.                 coalesce(CASE WHEN liType = 'coupon' AND li.type = liType THEN li.amount/cntAll END, 0) coupon,
  6.                 coalesce(CASE WHEN liType = 'shipping' AND li.type = liType THEN li.amount/cntAll END, 0) shipping,
  7.                 coalesce(CASE WHEN liType = 'donate' AND li.type = liType THEN li.amount/cntAll END, 0) donate,
  8.                 o.delivery_last_name,
  9.                 o.primary_email,
  10.                 FROM_UNIXTIME(d.delivery_time, '%Y-%m-%d %H:%i') AS delivery_time,
  11.                 d.delivery_timeframe,
  12.                 FROM_UNIXTIME(d.end_delivery_time, '%Y-%m-%d %H:%i') AS end_delivery_time,
  13.                 d.delivered,
  14.                 pv.value
  15. FROM nutrition_program_delivery d
  16. CROSS JOIN (
  17.         SELECT count(*) cntAll FROM nutrition_program_delivery
  18. ) tcnt
  19. LEFT JOIN uc_orders o ON o.order_id = d.order_id
  20. LEFT JOIN uc_order_line_items li ON li.order_id = d.order_id AND li.type IN ('coupon', 'shipping', 'donate')
  21. LEFT JOIN courier_delivery_offer cof ON cof.delivery_id = d.id AND cof.STATUS = 'accepted'
  22. LEFT JOIN (
  23.         SELECT DISTINCT fid FROM profile_fields WHERE name = 'profile_last_name'
  24. ) t ON pv.fid = t.fid
  25. CROSS JOIN (
  26.         SELECT 'coupon' liType UNION ALL SELECT 'shipping' UNION ALL 'donate'
  27. ) t2
  28.  

Что я сделал. Заменил три лефт-джойна на кросс-джойн с кейсом. Это иногда бывает быстрее лефт джойнов. Посмотрите, действительно ли будет прирост в скорости у вас и если да, то пользуйтесь.
У вас в запросе используется COUNT(d.id). Запрос скорее всего делает не то,что вы хотели, а возвращает одну строчку (потому что не указан GROUP BY). Если я прав, то для этого в моем варианте в подзапросе один раз вычисляется count и потом используется вычисленный cntAll.
Убрал LEFT JOIN nutrition_program_delivery oc ON oc.order_id = d.order_id, потому что он нигде не используется.
Переписал IN в JOIN. Mysql(по крайней мере 5.5) отвратительно оптимизирует IN, как правило, преобразовывая его в exists и вычисляя для каждой строки. Maria, например, так не делает.

Что еще можно сделать:
Убедиться, что по полям, по которым фильтруются данные есть индексы и по полям, по которым джойнятся таблицы - тоже есть индексы.
Переписать лефт-джойн в иннер-джойн, если он подходит по смыслу, такой запрос будет качественнее оптимизироваться самой СУБД.
Champion Отправлено: 24 Мая, 2013 - 17:12:40 • Тема: выбор данных из MySQL • Форум: Вопросы новичков

Ответов: 39
Просмотров: 1559
Я про те, которые в том сообщении, которое я процитировал.
А по теме: вопрос решен? Можно закрывать?
Champion Отправлено: 24 Мая, 2013 - 14:59:13 • Тема: выбор данных из MySQL • Форум: Вопросы новичков

Ответов: 39
Просмотров: 1559
Saymor пишет:
поэтому остановился на таком запросе:
Вы тогда не получите всех записей с минимальной ценой, если их больше, чем 1. Я же написал варианты, которые можно использовать.

imya пишет:
Запросы, которые я привёл выше, корректно отработали в MS SQL Server 2008 , так что в их работоспособности я не сомневаюсь.
Позвольте уличить Вас в неправде. Такие запросы не будут выполняться в MSSS. не вводите окружающих в заблуждение.
Champion Отправлено: 23 Мая, 2013 - 20:09:22 • Тема: выбор данных из MySQL • Форум: Вопросы новичков

Ответов: 39
Просмотров: 1559
imya пишет:
Не вижу проблемы)
Эээ. Вы доа=вольно своеобразно используете SQL. Я ваш запрос ен понимаю. И Mysql не поймет, хотя и вернет какие-то странные строки. Другие субд пошлют вас с таким запросом.
LIME пишет:
HAVING работает только с агрегирующими ф-циями
нет) С любым столбцом результирующего набора, получившимся после группирования и использования вычислимых столбцов.
(Добавление)
Сейчас напишу немного теории, а потом немного практики
(Добавление)
Как работает HAVING. Точнее, как работает запрос вообще. Сначала происходит фильтрация по условиям, указанным в WHERE и группировки. Здесь используются данные таблиц и индексов. После этого получается результирующий набор, который можно отфильтровать с помощью having. Это как будто взять в скобки наш первый запрос, написать перед скобками select * from, а после скобок where с тем условием, которое вы пытаетесь запихать в хэвинг. Попробуйте и осознаете, почему having price=min(price) не имеет особого смысла.

Теперь практика.
В mysql мы можем, например, так (в порятке предпочтения)
1. select * from tbl where price in (select min(price) from tbl union all select min(price) from tbl)
2. select * from tbl join (select min(price) minp, max(price)maxp from tbl) t ON price IN (maxp,minp)
3. Те же 2 запроса, но min и max можно заменить на order by asc/desc с limit 1 - это иногда быстрее.
4. Использовать переменную. Но это муторно, мне лень писать. Если только заинтересует.
5. Через not exists

В нек. ругих субд можно написать
select *, min(price) over(partition by Obj) minp, max(price) over(partition by Obj) maxp
from tbl
having price in (minp, maxp)
Champion Отправлено: 17 Мая, 2013 - 16:14:09 • Тема: ЧПУ и GET • Форум: Вопросы новичков

Ответов: 6
Просмотров: 303
RickMan пишет:
Ну и?
ну и убери это из htaccess
Champion Отправлено: 15 Мая, 2013 - 18:32:47 • Тема: ЧПУ и GET • Форум: Вопросы новичков

Ответов: 6
Просмотров: 303
RickMan пишет:
RewriteRule ^index/
Champion Отправлено: 14 Мая, 2013 - 23:12:15 • Тема: Left JOIN Yii • Форум: Работа с СУБД

Ответов: 2
Просмотров: 2105
в select() нужно указать список столбцов, в котором ненужный user_id можно не перечислять.
Или поменять таблицы местами и сделать right join, тогда таблица справа всегда будет со значением, и user_id будет в итоге правый
Champion Отправлено: 14 Мая, 2013 - 17:05:17 • Тема: ПОМОГИТЕ УСКОРИТЬ AJAX ЗАПРОС • Форум: Вопросы новичков

Ответов: 31
Просмотров: 1549
Да, еще сталкивался с тем, что на семерке mysql на localhost коннектится медленно, а на 127.0.0.1 - быстро. И не важно, прописан ли локалхост в hosts.
Champion Отправлено: 30 Апреля, 2013 - 20:41:21 • Тема: Поиск возможных комбинаций слов.. • Форум: Регулярные выражения

Ответов: 29
Просмотров: 1289
LIME пишет:
замеришь против регулярки?

float(3.1662002086639) float(2.857399892807) на короткой строке
float(3.5562990188599) float(2.9403080463409) на длинной
Та таком простеньком регулярка тоже проиграла. Но она удобнее читается)
Champion Отправлено: 30 Апреля, 2013 - 14:53:31 • Тема: Поиск возможных комбинаций слов.. • Форум: Регулярные выражения

Ответов: 29
Просмотров: 1289
А если есть под рукой, можешь продемонстрировать?
Champion Отправлено: 30 Апреля, 2013 - 13:54:07 • Тема: Поиск возможных комбинаций слов.. • Форум: Регулярные выражения

Ответов: 29
Просмотров: 1289
LIME пишет:
однакож стоит хоть немного усложнить регулярку и посыпется в геометрической прогрессии(это замечание для новичков)
Напиши-ка стрпозами то, что может сделать усложненная регулярка - что там посыпится?)
Champion Отправлено: 30 Апреля, 2013 - 12:32:23 • Тема: Поиск возможных комбинаций слов.. • Форум: Регулярные выражения

Ответов: 29
Просмотров: 1289
Длина строки, время выполнения 1000000 итераций:
1. Искомая строка 5 символов близко к началу
int(3366) double(3.8106479644775) double(3.3490209579468)
2. Искомая строка 5 символов в конце (или вообще отсутствует)
int(3366) double(6.5905828475952) double(3.3512721347809)
3. Искомая строка находится ближе к концу, ее длина 1000 символов
int(3366) double(24.582785129547) double(2.3106808662415).

Последний случай - явление довольно редкое, а вот первые 2 показывают, что стрпоз сопоставим с регуляркой.
Champion Отправлено: 30 Апреля, 2013 - 08:32:25 • Тема: Поиск возможных комбинаций слов.. • Форум: Регулярные выражения

Ответов: 29
Просмотров: 1289
если чисто регуляркой, то
PHP:
скопировать код в буфер обмена
  1.  /(?:(?:дайте|дадите|можно).+?(?:админку|хелперку|хелпера)|(?:админку|хелперку|хелпера).+(?:дайте|дадите|можно))/is


Но если слов больше и порядок тоже не имеет значения, то таким способом можно задолбаться писать.

Можно сделать так (я напишу на PHP, Вы переведете на свой язык):
preg_match_all('/(дайте|дадите|можно)|(админку|хелперку|хелпера)/', $src, $m);
а потом циклом проверить, чтоб все элементы $m[1] были не пустые.

Что будет работать быстрее - preg_match_all + цикл по совпадниям или цикл со стрпозами - вопрос спорный. Регулярка почти всегда быстрее двух стрпозов (если она выполняет то же самое, что планируется сделать двумя стрпозами). А если матчить точное совпадение, то она сопоставима по скорости со стрпозом.
Champion Отправлено: 07 Февраля, 2013 - 22:53:48 • Тема: Задача с числами • Форум: Вопросы новичков

Ответов: 10
Просмотров: 985
EuGen пишет:
метод Ленстры
Thanks
Champion Отправлено: 07 Февраля, 2013 - 22:46:13 • Тема: Задача с числами • Форум: Вопросы новичков

Ответов: 10
Просмотров: 985
EuGen пишет:
Иными словами - у нас есть множество делителей, выбираем из них тот, что наиболее близок к квадратному корню и затем делим исходное число на него
Опять же в примере числа 4 и 6 - изначально у нас их нет. Они сами получаются перемножением наших имеющихся делителей.

Кстати, наверное, вообще правильнее разлагать только 24, получать пары, а потом искать пары в большом числе в порядке их сумм
(Добавление)
EuGen пишет:
Я планирую сделать факторизацию по методу эллиптических кривых
Он, к сожаленнию, выходит за границы моих математических познаний, поэтому я не могу оценить, на сколько этот метод крут)

EuGen пишет:
так любой перебор должен останавливаться.

Ну разумеется) Я просто предположил, что это произойдет быстрее, чем перебор до N (я почему-то только о нем подумал).
EuGen пишет:
Кстати, перебирать достаточно до округленного вверх квадратного корня из исходного числа.
Точно.

Страниц (289): « 1 2 [3] 4 5 6 7 8 9 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB