Оптимизация запроса

berkut

Новичок
Gas
ну я представляю разницу, в порядке следования полей в индексе. но на 850,000 + поля tinyint, int - хоть как крутись, существенной разницы с 6-ю секундами не будет
 

Gas

может по одной?
Дело конечно не в типе полей, а в операции _не равно_ над b-tree индексом. Но раз в случае ТС действительно всё так плохо - предлагаю тему прикрывать.
 

berkut

Новичок
а чего прикрывать-то, если кто-то выскажет мнение - смертельно?
 

chira

Новичок
zip111
Есть ли возможность получить объяснение, какой нужен результат, простым языком. Возможно найдётся другой алгоритм.
Нужно "заставить работать представленный запрос" - это не объяснение.
Глядя на запрос я вижу (предполагаю), что в вычисляем поле идёт вычисление процента для полей c_budget, link_cost их сложение - это как-то можно понять, но эти вычисления искажаются функией RAND() и ещё сортируются по этому полю.
С таким успехом можно было просто по RAND отсортировать и не выполнять SELECT MAX ...
Вопрос: сколько записей из 850 000 удовлетворяют условию user_id = 1?

-~{}~ 20.02.08 08:16:

приведи как будет выполняться запрос
Код:
SELECT id, c_name
FROM `campaign`
WHERE c_status != '1'
AND user_id = '1'
ORDER BY RAND()
 

nirex

Новичок
SELECT c.id, c.c_name, format( rand( ) *100, 0 ) *35 + format( c.c_budget *100 / (c1.mcb), 0 ) *35 + format( c.link_cost *100 / (c1.mlc) , 0 ) *30 AS koeff from
(SELECT id, c_name, c_budget, link_cost FROM `campaign` WHERE c_status != '1' AND user_id = '1' ORDER BY koeff DESC LIMIT 0,30) c,
(SELECT max( c_budget ) as mcb , max( link_cost ) as mlc FROM campaign ) c1

попробуй, даже не знаю будет ли быстрее, но впринципе должно
отпишись по результатам
 

zip111

Новичок
chira
Необходимо вывести все значения id, c_name отсортированные в порядке убывания по "значимости" с лимитом к примеру 50 (на страницу). За значимость отвечают три параметра:

1. Бюджет - 35% коэффициент значимости
2. Стоимость перехода по ссылке - 35% -//-//-//-
3. Случайность - 30% -//-//-//-

+ должно выполняться условие что статус кампании не есть '1'.

Запрос немного изменился и теперь юзер_id не учитывается.

-~{}~ 20.02.08 10:22:

nirex

спс, после обеда отпишусь.

-~{}~ 20.02.08 10:23:

Alexandre
спс, учту. А что, существует реальная разница в производительности между WHERE id = '0' и WHERE id != '1'? С чем это связано? Где почитать можно?
 

Wicked

Новичок
1. Бюджет - 35% коэффициент значимости
2. Стоимость перехода по ссылке - 35% -//-//-//-
3. Случайность - 30% -//-//-//-
Если отсортировать записи по 1 + 2, взять (1 + 2) тридцатой из них, и поделить это на 1.43, то получим такое хорошее число, что записи, имеющие 1+2 меньше оного нас в принципе не интересуют при любом раскладе случайности :)
 

Alexandre

PHPПенсионер
А что, существует реальная разница в производительности между WHERE id = '0' и WHERE id != '1'? С чем это связано? Где почитать можно?
я читал здесь. народ уже рассказал, что индекса строются по схеме b-tree, который допускает "быстрый" поиск ( кол-во шагов = sqrt(n), где n- общее кол-во записей ) только по условию равно
если будет "не равно", то индекс не используется, а сдедовательно идет полный перебор набора записей.

можно прочитать в мане http://dev.mysql.com/doc/refman/5.0/en/optimization.html
http://dev.mysql.com/doc/refman/5.0/en/storage-engines.html

еще в одном из последних инсайдов (#19 ) была статья "Оптимизация mysql"
 

chira

Новичок
zip111
Необходимо вывести все значения id, c_name отсортированные в порядке убывания по "значимости" с лимитом к примеру 50 (на страницу). За значимость отвечают три параметра:

1. Бюджет - 35% коэффициент значимости
2. Стоимость перехода по ссылке - 35% -//-//-//-
3. Случайность - 30% -//-//-//-
Попробую подругому ...
во первых я вижу:
1. Бюджет - 35%
2. Стоимость перехода по ссылке - 30%
3. Случайность - 35%

"значимость" - это 1+2, как только ты к этому добавляешь +3 такого же порядка, то значение значимости пропадает (вернее уменьшается на 35%)


-~{}~ 20.02.08 11:23:

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

Alexandre

PHPПенсионер
тогда уж log2(n)
гууугль рулит:
1. Алгоритм поиска по бинарному дереву.
Суть этого алгоритма достаточно проста. Представим себе, что у нас есть набор карточек с телефонными номерами и адресами людей. Карточки отсортированы в порядке возрастания телефонных номеров. Необходимо найти адрес человека, если мы знаем, что его номер телефона 222-22-22. Наши действия? Берем карточку из середины пачки, номер карточки 444-44-44. Сравнивая его с искомым номером, мы видим, что наш меньше и , значит, находится точно в первой половине пачки. Смело откладываем вторую часть пачки в сторону, она нам не нужна, массив поиска мы сузили ровно в два раза. Теперь берем карточку из середины оставшейся пачки, на ней номер 123-45-67. Из чего следует, что нужная нам карточка лежит во второй половине оставшейся пачки... Таким образом , при каждом сравнении , мы уменьшаем зону поиска в два раза. Отсюда и название метода - половинного деления или дихотомии.
Не буду приводить математического доказательства, так как это не является целью данной статьи, а просто отмечу, что скорость сходимости этого алгоритма пропорциональна Log(2)N ? . Это означает буквально то, что не более, чем через Log(2)N сравнений , мы либо найдем нужное значение, либо убедимся в его отсутствии.
 

Wicked

Новичок
1) если ты делаешь такую поправку, то ты не понимаешь смысла символа O(). http://algolist.manual.ru/misc/o_n.php - велкам.
2) если тебя интересует именно конкретика, то там основание явно не 2, потому что дерево у нас все-таки не бинарное.
 

Alexandre

PHPПенсионер
если тебя интересует именно конкретика, то там основание явно не 2, потому что дерево у нас все-таки не бинарное.
это почему же в индексе - дерево не бинарное?
 
Сверху