Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Время выполнения запроса 
V
    Опции темы
Bulat
Дата 21.7.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Код

    SELECT
    sum(rs.hits) as hits,
    sum(rs.hits * rs.price * o.percent/100)/1000 AS hits_amount,
    if (o.person = o1.person, 0, 1) as 'co_author'
    FROM ownership o
    LEFT JOIN read_stats rs ON rs.art = o.art #key
        LEFT JOIN ownership o1 ON o1.art = o.art #key
        JOIN copyrights c ON c.person = o1.person #key
    WHERE o.person = ? #int - key
        AND o.relation = ? #int
        AND rs.time >= ?  #datetime - key
        AND rs.time <= ?  #datetime - key
        AND c.user = ?  #int - key
    AND o.percent != 0 AND o1.percent != 0
      GROUP BY co_author


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

P.S. Есть аналогичные запросы, основное отличие в использовании вместо таблицы read_stats другой и разве что меньшее количество строк(т.е. в read_stats могут просуммироватся данные до нескольких десятков тысяч строк, сотня тысяч, а в аналогичных запросах - несколько десятков, сотня). Т.е. может ли количество строк в данном случае замедлять запрос?? 


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Kesh
Дата 21.7.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Конечно, у вас же помимо выборки еще умножение - деление удет...
Будет чуть-чуть быстрее, если o.percent/100)/1000 -> o.percent*0.000001


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 21.7.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Kesh @  21.7.2008,  16:06 Найти цитируемый пост)
Будет чуть-чуть быстрее, если o.percent/100)/1000 -> o.percent*0.000001 

в смысле, вынести константу за вызов аргегирующей функции sum.
это раз.
заменить if на условие where + union.
или вообще на стороне клиента делать if.
как много строк в таблицах, на которые делается left join?
PM MAIL   Вверх
Bulat
Дата 21.7.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(skyboy @  21.7.2008,  18:16 Найти цитируемый пост)

заменить if на условие where + union.
или вообще на стороне клиента делать if.


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

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

Надеюсь не слишком запутанно smile

Т.е. ownership(данные по конкретному автору) -> read_stats(статистика по книгам) -> ownership1(перебираю соавторов если они есть) ... и соотв. внизу группирую вся статистика для конкретного автора, и статистика для соавторов(часть статистика для конкретного автора)


Цитата(skyboy @  21.7.2008,  18:16 Найти цитируемый пост)
как много строк в таблицах, на которые делается left join? 


В read_stats несколько миллионов наберется, а в остальных от нескольких сотен, до пару десятков тысяч(но это уже не много).


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
skyboy
Дата 21.7.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Bulat @  21.7.2008,  17:55 Найти цитируемый пост)
Не очень соображу как расписать запрос в таком виде.

запрос 
Код

SELECT if(`field` = 3, 0, 1)
FROM `table`

может быть представлен в виде
Код

SELECT 0
FROM `table`
WHERE `field` = 3
UNION ALL
SELECT 0
FROM `table`
WHERE `field` <> 3

Цитата(Bulat @  21.7.2008,  17:55 Найти цитируемый пост)
но это уже не много

почему же? smile
у тебя же left join. значит, происходит практически перемножение.
т.е. результат будет порядка:
10^6 * 10^4 * 10^2 * 10^2 == 10^14
это даже не миллиарды записей.
и по ним ты делаешь группировку.... smile
посмотри, сколько записей у тебя возвращает запрос без "group by"
PM MAIL   Вверх
Bulat
Дата 22.7.2008, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



skyboy, Нет, нет, нет

Код

    SELECT
    sum(rs.hits) as hits,
    sum(rs.hits * rs.price * o.percent*0.000001) AS hits_amount,
    0 as 'co_author'
    FROM ownership o
    LEFT JOIN read_stats rs ON rs.art = o.art 
        LEFT JOIN ownership o1 ON o1.art = o.art
        JOIN copyrights c ON c.person = o1.person 
    WHERE o.person = ? AND o.relation = ?    AND rs.time >= ? AND rs.time <= ?    AND c.user = ?
    AND o.percent != 0 AND o1.percent != 0 AND o.person = o1.person
    UNION ALL
    SELECT
    sum(rs.hits) as hits,
    sum(rs.hits * rs.price * o.percent*0.000001) AS hits_amount,
    1 as 'co_author'
    FROM ownership o
    LEFT JOIN read_stats rs ON rs.art = o.art 
        LEFT JOIN ownership o1 ON o1.art = o.art
        JOIN copyrights c ON c.person = o1.person 
    WHERE o.person = ? AND o.relation = ?    AND rs.time >= ? AND rs.time <= ?    AND c.user = ?
    AND o.percent != 0 AND o1.percent != 0 AND o.person <> o1.person


К сожалению даже такой запрос, не дал нужных ускорений, хотя все же немного быстрее заработало.

Но это еще не все. smile

Код

    select
    p.s_full_name as s_author_for_stat, p.id as person_id, p.lvl, o.relation,
    sum(rs.hits) as hits,
    sum(rs.hits * rs.price * o.percent/100)/1000 AS hits_amount
    from copyrights c
    left join    persons p on c.person=p.id
    left join ownership o on o.person=p.id
    left join read_stats rs ON rs.time >= ? AND rs.time <= ? and rs.art=o.art
    where    c.user=?
    group by p.id, o.relation
    order by p.s_full_name asc


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

Больше я ни с чем не могу связать. Кстати последний запрос, который сейчас на боевом сервере работает быстро, у меня отрабатывает тоже довольно долго smile




--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ТоляМБА
Дата 22.7.2008, 09:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 10
Всего: 252



Цитата(Bulat @  22.7.2008,  12:25 Найти цитируемый пост)
    select    p.s_full_name as s_author_for_stat, p.id as person_id, p.lvl, o.relation,
    sum(rs.hits) as hits,    sum(rs.hits * rs.price * o.percent/100)/1000 AS hits_amount    
from copyrights c    
left join    persons p on c.person=p.id    
left join ownership o on o.person=p.id    
left join read_stats rs ON rs.time >= ? AND rs.time <= ? and rs.art=o.art    
where    c.user=?    group by p.id, o.relation    order by p.s_full_name asc

Разве это рабочий запрос? Ведь выделенные красным поля не включены в Group by
PM   Вверх
skyboy
Дата 22.7.2008, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



не надо делать так
Цитата(Bulat @  22.7.2008,  08:25 Найти цитируемый пост)
sum(rs.hits * rs.price * o.percent*0.000001)

надо делать так:
Код

sum(rs.hits * rs.price * o.percent)*0.000001

дамп структуры БД и хранимку, которая заполняла бы БД рандомными значениями можешь выложить?
PM MAIL   Вверх
Bulat
Дата 22.7.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(skyboy @  22.7.2008,  09:34 Найти цитируемый пост)
не надо делать так

надо делать так:


Я делал и так, и так. Все равно довольно медленно smile

Цитата(skyboy @  22.7.2008,  09:34 Найти цитируемый пост)
дамп структуры БД и хранимку, которая заполняла бы БД рандомными значениями можешь выложить? 


Вот что могу прям счас выложить. Знаю, не много, но есть определенные "но", да и занят пока другой срочной работой.

Код

| read_stats | CREATE TABLE `read_stats` (
  `art` int(10) unsigned NOT NULL default '2',
  `place` smallint(5) unsigned NOT NULL default '0',
  `time` date default NULL,
  `hits` smallint(5) unsigned NOT NULL default '0',
  `processed` smallint(5) unsigned NOT NULL default '0',
  `price` tinyint(3) unsigned NOT NULL default '30',
  UNIQUE KEY `art` (`art`,`place`,`time`,`processed`),
  KEY `non_proc` (`processed`,`art`),
  KEY `read_stats_ibfk_2` (`place`),
  KEY `time` (`time`),
  CONSTRAINT `read_stats_ibfk_1` FOREIGN KEY (`art`) REFERENCES `arts` (`id`) ON
 DELETE CASCADE,
  CONSTRAINT `read_stats_ibfk_2` FOREIGN KEY (`place`) REFERENCES `read_places`
(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

| ownership | CREATE TABLE `ownership` (
  `art` int(10) unsigned NOT NULL default '0',
  `person` int(10) unsigned NOT NULL default '0',
  `relation` tinyint(3) unsigned NOT NULL default '0',
  `percent` tinyint(3) unsigned default NULL,
  KEY `art` (`art`),
  KEY `person` (`person`),
  KEY `relation` (`relation`),
  CONSTRAINT `ownership_ibfk_1` FOREIGN KEY (`art`) REFERENCES `arts` (`id`) ON
DELETE CASCADE,
  CONSTRAINT `ownership_ibfk_2` FOREIGN KEY (`person`) REFERENCES `persons` (`id
`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

| copyrights | CREATE TABLE `copyrights` (
  `user` int(10) unsigned NOT NULL default '0',
  `person` int(10) unsigned NOT NULL default '0',
  `sale_part` tinyint(3) unsigned NOT NULL default '33',
  `read_price` tinyint(3) unsigned NOT NULL default '30',
  UNIQUE KEY `person_2` (`person`),
  KEY `user` (`user`),
  CONSTRAINT `copyrights_ibfk_1` FOREIGN KEY (`user`) REFERENCES `users` (`id`),

  CONSTRAINT `copyrights_ibfk_2` FOREIGN KEY (`person`) REFERENCES `persons` (`i
d`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |


ТоляМБА, "политика" такая. smile Если бы она была чуть иная, скорее всего с медленно работающими запросами, у которых хороший explain я бы вряд ли столкнулся. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
skyboy
Дата 22.7.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Bulat @  22.7.2008,  09:41 Найти цитируемый пост)
 Знаю, не много

мягко говоря, не хватает таблицы persons.
и хоть по 2-3 записи на таблицу.
PM MAIL   Вверх
Bulat
Дата 22.7.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(skyboy @  22.7.2008,  10:50 Найти цитируемый пост)
мягко говоря, не хватает таблицы persons.


сорри

Код

| persons | CREATE TABLE `persons` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `alphabet` char(1) default NULL,
  `s_first_name` varchar(255) default NULL,
  `s_middle_name` varchar(255) default NULL,
  `s_last_name` varchar(255) default NULL,
  `s_full_name` varchar(255) default NULL,
  `s_banking` text,
  `s_phone` varchar(50) default NULL,
  `s_email` varchar(50) default NULL,
  `s_www` varchar(50) default NULL,
  `text_description` text,
  `ext_id` varchar(100) default NULL,
  `unchecked` tinyint(3) unsigned NOT NULL default '0',
  `s_gps` varchar(50) default NULL,
  `birth_year` int(11) default NULL,
  `s_adress` varchar(250) default NULL,
  `on_sale` smallint(5) unsigned NOT NULL default '0',
  `owner` int(10) unsigned default NULL,
  `lvl` tinyint(4) NOT NULL default '0',
  `top_genres` varchar(30) default NULL,
  PRIMARY KEY  (`id`),
  KEY `alphabet` (`alphabet`),
  KEY `owner` (`owner`),
  CONSTRAINT `persons_ibfk_1` FOREIGN KEY (`owner`) REFERENCES `users` (`id`) ON
 DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |



А вот записи, реальные на вряд ли. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
skyboy
Дата 22.7.2008, 11:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Bulat @  22.7.2008,  10:13 Найти цитируемый пост)
А вот записи, реальные на вряд ли

нафиг мне реальные данные?
во все текстовые поля запихни один символ(произвольный).
timestamp - рандомное число.
не заниматься же мне ещё и анализом структуры БД, чтоб заполнить хотя бы десятком записей с корректными значениями, верно?
PM MAIL   Вверх
sTa1kEr
Дата 22.7.2008, 16:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 7
Всего: 146



Цитата(skyboy @  21.7.2008,  19:16 Найти цитируемый пост)
заменить if на условие where + union.

По вашему атомарная логическая операция требует больше ресурсов, чем выполнение всего запроса дважды?
Плюс ко всему будет дублирование запроса, что то же является моветоном.

ТоляМБА, совершенно верное замечание. Хоть MySQL и не выдает ошибку, выборка полей не сгруппированных и не использующих агрегатные функции - полностью бессмысленна и непредсказуема.

Bulat, попробуйте постепенно упрощать запрос, убирая по одному элементу из запроса. 
Так же выполните запрос SHOW STATUS, возможно серверу просто не хватает места для кеширования всех индексов, используемых в запросе. Попробуйте поиграться с параметрами сервера Tuning Server Parameters и InnoDB Performance Tuning Tips
PM MAIL   Вверх
skyboy
Дата 22.7.2008, 16:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



sTa1kEr, в случае с двумя запросами уходит одна из группировок как раз по этому  результату "атомарной логической операции". так что даже не знаю...

Добавлено через 1 минуту и 11 секунд
Цитата(sTa1kEr @  22.7.2008,  15:01 Найти цитируемый пост)
Плюс ко всему будет дублирование запроса

если есть вариант: подзапрос или union что выберешь ты?
кстати говоря, индекс применяется при использовании функции(оператора) if?
PM MAIL   Вверх
sTa1kEr
Дата 22.7.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 7
Всего: 146



Цитата(skyboy @  22.7.2008,  17:11 Найти цитируемый пост)
в случае с двумя запросами уходит одна из группировок

Прошу прощенья, не заметил группировку. В этом случае, я думаю, будет по сути примерно одно и тоже.
Цитата(skyboy @  22.7.2008,  17:11 Найти цитируемый пост)
если есть вариант: подзапрос или union что выберешь ты?

При чем тут подзапрос? Я имел ввиду то, что операция if() сама по себе ничего не стоит.
Цитата(skyboy @  22.7.2008,  17:11 Найти цитируемый пост)
кстати говоря, индекс применяется при использовании функции(оператора) if? 

Какой индекс в поле выборки?
PM MAIL   Вверх
Bulat
Дата 22.7.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(sTa1kEr @  22.7.2008,  16:01 Найти цитируемый пост)
Так же выполните запрос SHOW STATUS, возможно серверу просто не хватает места для кеширования всех индексов, используемых в запросе. 

Во!

Это меня интересует в первую очередь, т.е. не серверу, а моему локальному компу не хватает каких-то ресурсов. Потому что на боевом сервере все отрабатывает довольно быстро, а на моем локальном компе, довольно медленно. Вот только не доразберусь я во всем этом, там целых 245 строк. Может что поконкретнее show status like '?' ?? smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
skyboy
Дата 22.7.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(sTa1kEr @  22.7.2008,  15:53 Найти цитируемый пост)
Какой индекс в поле выборки? 

вот-вот.
по результату сравнения в if выбирается константное значение поля выборки(1 или 0). индексы по сравниваемым полям не используются.
или это же сравнение происходит в секции where(в случае использования union), что не обязано ускорить выполнение, но допускает использование индекса по полям o.person и ol.person(которые сравниваются). я ошибаюсь?
Цитата(sTa1kEr @  22.7.2008,  15:53 Найти цитируемый пост)
Прошу прощенья, не заметил группировку.

да, ничего. тем более, не во всех запросах она почему-то фигурирует: сразу была, потом без неё работаем, потом - снова всплыла...
Цитата(sTa1kEr @  22.7.2008,  15:53 Найти цитируемый пост)
При чем тут подзапрос? Я имел ввиду то, что операция if() сама по себе ничего не стоит.

ну, я же не знал, что ты не видел группировку. хотел вот намекнуть, что не всегда простая операция столь незначительна(пожалуй, с подзапросом слишком "простая" и "далекая" аналогия; ни в коей мере не хотел оскорбить). так же, как и умножение(или деление), которое выполняется внутри агрегирующей функции - вроде мелочь, но в случае нескольких миллионов записей уже как бы и не мелочь...

Добавлено через 1 минуту и 40 секунд
Цитата(Bulat @  22.7.2008,  18:33 Найти цитируемый пост)
Вот только не доразберусь я во всем этом, там целых 245 строк.

брось сюда в код без подсветки.
или лучше - атачем...
раз уж не хочешь фейковые данные для наполнения таблиц набросать smile
PM MAIL   Вверх
Fortop
Дата 22.7.2008, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 42



Цитата(skyboy @  22.7.2008,  19:46 Найти цитируемый пост)
которое выполняется внутри агрегирующей функции - вроде мелочь, но в случае нескольких миллионов записей уже как бы и не мелочь...

Вот да, кстати, все не досуг было проверить, а любопытно....

ТС, что быстрее будет отрабатывать? SUM(a * b * c) Или просто SUM(a), SUM(b), SUM© 
а затем уже перемножаем локально...


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 22.7.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Fortop @  22.7.2008,  19:44 Найти цитируемый пост)
ТС, что быстрее будет отрабатывать? SUM(a * b * c) Или просто SUM(a), SUM(b), SUM© 

в задаче о Bulat'a стоит вопрос по-другому: если каждое значение умножать на число(0,0001), а потом пытаться суммировать - догадается ли оптимизатор сначала все посуммировать, а потом уже умножить полученную сумму? я бы не полагался на оптимизатор в таких тонсостях...
PM MAIL   Вверх
Fortop
Дата 22.7.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 42



Цитата(skyboy @  22.7.2008,  21:48 Найти цитируемый пост)
в задаче о Bulat'a стоит вопрос по-другому:

Уточняю smile

Я спрашивал про вот это

Код

sum(rs.hits * rs.price * o.percent)



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 22.7.2008, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Fortop, сумма произведений и произведение сумм - далеко не одно и то же: 2*3*4 + 2*3*4 != (2 + 2) * (3 + 3) * (4 + 4). тут уже никак не разделишь(не считая вырожденных случаев, когда один из множителей - 0 и тому подобных редких крайностей)
PM MAIL   Вверх
Fortop
Дата 22.7.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 42



Цитата(skyboy @  22.7.2008,  22:42 Найти цитируемый пост)
Fortop, сумма произведений и произведение сумм 

smile знаю, но меня интересует именно скорость работы.

Что-то мне подсказывает, что выгоднее будет при вставке, вставлять и нужное произведение. А затем всего лишь суммировать его.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
sTa1kEr
Дата 22.7.2008, 23:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 7
Всего: 146



Цитата(skyboy @  22.7.2008,  20:46 Найти цитируемый пост)
в секции where(в случае использования union), что не обязано ускорить выполнение, но допускает использование индекса по полям o.person и ol.person(которые сравниваются)

Правильно, а в первом случае условия в where вообще нету, поэтому и индексы не нужны совсем. Вообще, имхо, оба варианта очень схожи. Различие лишь в том, что в первом случае происходит полная выборка, а затем группировка по двум значением. А во втором происходит две выборки по двум значениям, а затем группировка всех данных.

Цитата(Fortop @  23.7.2008,  00:20 Найти цитируемый пост)
знаю, но меня интересует именно скорость работы.

Я думаю без разницы. Во всяком случае в реальной жизни нужно думать не о количестве арифметических операций, а о точности и корректности вычислений. К примеру sum(rs.hits * rs.price * o.percent) и sum(rs.hits) * avg(rs.price) * avg(o.percent), может быть второй вариант и быстрее на несколько миллисекунд, но вот точность вычислений явно при этом страдает.

Цитата(Bulat @  22.7.2008,  20:33 Найти цитируемый пост)
show status like '?' ??

Для начала стоит обратить пристальное внимание на:
Innodb_buffer_pool_reads, Innodb_buffer_pool_wait_free - в идеале должны равняться нулю.
Key_reads - должно быть значительно меньше чем Key_read_requests
Created_tmp_disk_tables - в идеале должно равняться нулю
Opened_tables - так же чем меньше - тем лучше

Это сообщение отредактировал(а) sTa1kEr - 23.7.2008, 07:48
PM MAIL   Вверх
Bulat
Дата 23.7.2008, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(sTa1kEr @  22.7.2008,  23:58 Найти цитируемый пост)
Innodb_buffer_pool_reads, Innodb_buffer_pool_wait_free - в идеале должны равняться нулю.


А если не в идеале
Код

+-----------------------------------+-----------+
| Variable_name                     | Value     |
+-----------------------------------+-----------+
| Innodb_buffer_pool_pages_data     | 12003     |
| Innodb_buffer_pool_pages_dirty    | 0         |
| Innodb_buffer_pool_pages_flushed  | 2832008   |
| Innodb_buffer_pool_pages_free     | 0         |
| Innodb_buffer_pool_pages_latched  | 0         |
| Innodb_buffer_pool_pages_misc     | 797       |
| Innodb_buffer_pool_pages_total    | 12800     |
| Innodb_buffer_pool_read_ahead_rnd | 57658     |
| Innodb_buffer_pool_read_ahead_seq | 93726     |
| Innodb_buffer_pool_read_requests  | 784129487 |
| Innodb_buffer_pool_reads          | 3674823   |
| Innodb_buffer_pool_wait_free      | 0         |
| Innodb_buffer_pool_write_requests | 102839119 |
+-----------------------------------+-----------+


Код

+-----------------------------------+------------+
| Variable_name                     | Value      |
+-----------------------------------+------------+
| Aborted_clients                   | 40         |
| Aborted_connects                  | 0          |
| Binlog_cache_disk_use             | 0          |
| Binlog_cache_use                  | 0          |
| Bytes_received                    | 236        |
| Bytes_sent                        | 1273       |
| Com_admin_commands                | 0          |
| Com_alter_db                      | 0          |
| Com_alter_table                   | 0          |
| Com_analyze                       | 0          |
| Com_backup_table                  | 0          |
| Com_begin                         | 0          |
| Com_change_db                     | 1          |
| Com_change_master                 | 0          |
| Com_check                         | 0          |
| Com_checksum                      | 0          |
| Com_commit                        | 0          |
| Com_create_db                     | 0          |
| Com_create_function               | 0          |
| Com_create_index                  | 0          |
| Com_create_table                  | 0          |
| Com_dealloc_sql                   | 0          |
| Com_delete                        | 0          |
| Com_delete_multi                  | 0          |
| Com_do                            | 0          |
| Com_drop_db                       | 0          |
| Com_drop_function                 | 0          |
| Com_drop_index                    | 0          |
| Com_drop_table                    | 0          |
| Com_drop_user                     | 0          |
| Com_execute_sql                   | 0          |
| Com_flush                         | 0          |
| Com_grant                         | 0          |
| Com_ha_close                      | 0          |
| Com_ha_open                       | 0          |
| Com_ha_read                       | 0          |
| Com_help                          | 0          |
| Com_insert                        | 0          |
| Com_insert_select                 | 0          |
| Com_kill                          | 0          |
| Com_load                          | 0          |
| Com_load_master_data              | 0          |
| Com_load_master_table             | 0          |
| Com_lock_tables                   | 0          |
| Com_optimize                      | 0          |
| Com_preload_keys                  | 0          |
| Com_prepare_sql                   | 0          |
| Com_purge                         | 0          |
| Com_purge_before_date             | 0          |
| Com_rename_table                  | 0          |
| Com_repair                        | 0          |
| Com_replace                       | 0          |
| Com_replace_select                | 0          |
| Com_reset                         | 0          |
| Com_restore_table                 | 0          |
| Com_revoke                        | 0          |
| Com_revoke_all                    | 0          |
| Com_rollback                      | 0          |
| Com_savepoint                     | 0          |
| Com_select                        | 1          |
| Com_set_option                    | 0          |
| Com_show_binlog_events            | 0          |
| Com_show_binlogs                  | 0          |
| Com_show_charsets                 | 0          |
| Com_show_collations               | 0          |
| Com_show_column_types             | 0          |
| Com_show_create_db                | 0          |
| Com_show_create_table             | 0          |
| Com_show_databases                | 0          |
| Com_show_errors                   | 0          |
| Com_show_fields                   | 0          |
| Com_show_grants                   | 0          |
| Com_show_innodb_status            | 0          |
| Com_show_keys                     | 0          |
| Com_show_logs                     | 0          |
| Com_show_master_status            | 0          |
| Com_show_ndb_status               | 0          |
| Com_show_new_master               | 0          |
| Com_show_open_tables              | 0          |
| Com_show_privileges               | 0          |
| Com_show_processlist              | 0          |
| Com_show_slave_hosts              | 0          |
| Com_show_slave_status             | 0          |
| Com_show_status                   | 5          |
| Com_show_storage_engines          | 0          |
| Com_show_tables                   | 0          |
| Com_show_triggers                 | 0          |
| Com_show_variables                | 0          |
| Com_show_warnings                 | 0          |
| Com_slave_start                   | 0          |
| Com_slave_stop                    | 0          |
| Com_stmt_close                    | 0          |
| Com_stmt_execute                  | 0          |
| Com_stmt_fetch                    | 0          |
| Com_stmt_prepare                  | 0          |
| Com_stmt_reset                    | 0          |
| Com_stmt_send_long_data           | 0          |
| Com_truncate                      | 0          |
| Com_unlock_tables                 | 0          |
| Com_update                        | 0          |
| Com_update_multi                  | 0          |
| Com_xa_commit                     | 0          |
| Com_xa_end                        | 0          |
| Com_xa_prepare                    | 0          |
| Com_xa_recover                    | 0          |
| Com_xa_rollback                   | 0          |
| Com_xa_start                      | 0          |
| Compression                       | OFF        |
| Connections                       | 3319       |
| Created_tmp_disk_tables           | 0          |
| Created_tmp_files                 | 7          |
| Created_tmp_tables                | 5          |
| Delayed_errors                    | 0          |
| Delayed_insert_threads            | 0          |
| Delayed_writes                    | 202        |
| Flush_commands                    | 1          |
| Handler_commit                    | 0          |
| Handler_delete                    | 0          |
| Handler_discover                  | 0          |
| Handler_prepare                   | 0          |
| Handler_read_first                | 0          |
| Handler_read_key                  | 0          |
| Handler_read_next                 | 0          |
| Handler_read_prev                 | 0          |
| Handler_read_rnd                  | 0          |
| Handler_read_rnd_next             | 21         |
| Handler_rollback                  | 0          |
| Handler_savepoint                 | 0          |
| Handler_savepoint_rollback        | 0          |
| Handler_update                    | 0          |
| Handler_write                     | 147        |
| Innodb_buffer_pool_pages_data     | 12003      |
| Innodb_buffer_pool_pages_dirty    | 0          |
| Innodb_buffer_pool_pages_flushed  | 2832008    |
| Innodb_buffer_pool_pages_free     | 0          |
| Innodb_buffer_pool_pages_latched  | 0          |
| Innodb_buffer_pool_pages_misc     | 797        |
| Innodb_buffer_pool_pages_total    | 12800      |
| Innodb_buffer_pool_read_ahead_rnd | 57658      |
| Innodb_buffer_pool_read_ahead_seq | 93726      |
| Innodb_buffer_pool_read_requests  | 784129487  |
| Innodb_buffer_pool_reads          | 3674823    |
| Innodb_buffer_pool_wait_free      | 0          |
| Innodb_buffer_pool_write_requests | 102839119  |
| Innodb_data_fsyncs                | 118890     |
| Innodb_data_pending_fsyncs        | 0          |
| Innodb_data_pending_reads         | 0          |
| Innodb_data_pending_writes        | 0          |
| Innodb_data_read                  | 2603159552 |
| Innodb_data_reads                 | 5401641    |
| Innodb_data_writes                | 2937101    |
| Innodb_data_written               | 950144512  |
| Innodb_dblwr_pages_written        | 2832008    |
| Innodb_dblwr_writes               | 34704      |
| Innodb_log_waits                  | 0          |
| Innodb_log_write_requests         | 6020016    |
| Innodb_log_writes                 | 43048      |
| Innodb_os_log_fsyncs              | 48777      |
| Innodb_os_log_pending_fsyncs      | 0          |
| Innodb_os_log_pending_writes      | 0          |
| Innodb_os_log_written             | 2637179904 |
| Innodb_page_size                  | 16384      |
| Innodb_pages_created              | 113329     |
| Innodb_pages_read                 | 5401631    |
| Innodb_pages_written              | 2832008    |
| Innodb_row_lock_current_waits     | 0          |
| Innodb_row_lock_time              | 0          |
| Innodb_row_lock_time_avg          | 0          |
| Innodb_row_lock_time_max          | 0          |
| Innodb_row_lock_waits             | 0          |
| Innodb_rows_deleted               | 1049       |
| Innodb_rows_inserted              | 12387920   |
| Innodb_rows_read                  | 235048704  |
| Innodb_rows_updated               | 1417       |
| Key_blocks_not_flushed            | 0          |
| Key_blocks_unused                 | 7173       |
| Key_blocks_used                   | 2          |
| Key_read_requests                 | 1264       |
| Key_reads                         | 119        |
| Key_write_requests                | 969        |
| Key_writes                        | 0          |
| Last_query_cost                   | 0.000000   |
| Max_used_connections              | 23         |
| Not_flushed_delayed_rows          | 0          |
| Open_files                        | 0          |
| Open_streams                      | 0          |
| Open_tables                       | 0          |
| Opened_tables                     | 0          |
| Qcache_free_blocks                | 0          |
| Qcache_free_memory                | 0          |
| Qcache_hits                       | 0          |
| Qcache_inserts                    | 0          |
| Qcache_lowmem_prunes              | 0          |
| Qcache_not_cached                 | 0          |
| Qcache_queries_in_cache           | 0          |
| Qcache_total_blocks               | 0          |
| Questions                         | 87255      |
| Rpl_status                        | NULL       |
| Select_full_join                  | 0          |
| Select_full_range_join            | 0          |
| Select_range                      | 0          |
| Select_range_check                | 0          |
| Select_scan                       | 5          |
| Slave_open_temp_tables            | 0          |
| Slave_retried_transactions        | 0          |
| Slave_running                     | OFF        |
| Slow_launch_threads               | 0          |
| Slow_queries                      | 0          |
| Sort_merge_passes                 | 0          |
| Sort_range                        | 0          |
| Sort_rows                         | 0          |
| Sort_scan                         | 0          |
| Ssl_accept_renegotiates           | 0          |
| Ssl_accepts                       | 0          |
| Ssl_callback_cache_hits           | 0          |
| Ssl_cipher                        |            |
| Ssl_cipher_list                   |            |
| Ssl_client_connects               | 0          |
| Ssl_connect_renegotiates          | 0          |
| Ssl_ctx_verify_depth              | 0          |
| Ssl_ctx_verify_mode               | 0          |
| Ssl_default_timeout               | 0          |
| Ssl_finished_accepts              | 0          |
| Ssl_finished_connects             | 0          |
| Ssl_session_cache_hits            | 0          |
| Ssl_session_cache_misses          | 0          |
| Ssl_session_cache_mode            | NONE       |
| Ssl_session_cache_overflows       | 0          |
| Ssl_session_cache_size            | 0          |
| Ssl_session_cache_timeouts        | 0          |
| Ssl_sessions_reused               | 0          |
| Ssl_used_session_cache_entries    | 0          |
| Ssl_verify_depth                  | 0          |
| Ssl_verify_mode                   | 0          |
| Ssl_version                       |            |
| Table_locks_immediate             | 186790     |
| Table_locks_waited                | 1          |
| Tc_log_max_pages_used             | 0          |
| Tc_log_page_size                  | 0          |
| Tc_log_page_waits                 | 0          |
| Threads_cached                    | 7          |
| Threads_connected                 | 1          |
| Threads_created                   | 275        |
| Threads_running                   | 1          |
| Uptime                            | 772147     |
+-----------------------------------+------------+


Цитата(skyboy @  22.7.2008,  19:46 Найти цитируемый пост)
раз уж не хочешь фейковые данные для наполнения таблиц набросать 

Можешь не верить, но времени позарез. То что есть напринтить могу, а так работой завили, даже подруга сеня свидание из меня просто выбивала smile

Это сообщение отредактировал(а) Bulat - 23.7.2008, 09:32


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
MuToGeN
Дата 23.7.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: нет
Всего: 32



Цитата(Bulat @  21.7.2008,  16:28 Найти цитируемый пост)
В чем могут быть причины медленного выполнения запроса

В том, что при выполнении запроса все читается с дискового накопителя, а при EXPLAIN все уже лежит в кеше.
Цитата(Bulat @  21.7.2008,  16:28 Найти цитируемый пост)
Т.е. может ли количество строк в данном случае замедлять запрос??

Задумайтесь о том, чем в этот момент занимается mysqld. Сначала ему надо прочитать все это, потом ему надо сделать выборку, потом составить из результатов что-то, выглядящее более-менее логично согласно JOINам. Естественно, что время выполнения запроса зависит от кол-ва рядов.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
Bulat
Дата 23.7.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(MuToGeN @  23.7.2008,  10:02 Найти цитируемый пост)
В том, что при выполнении запроса все читается с дискового накопителя, а при EXPLAIN все уже лежит в кеше.

Очень может быть smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
sTa1kEr
Дата 23.7.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 7
Всего: 146



Цитата(Bulat @  23.7.2008,  10:16 Найти цитируемый пост)
А если не в идеале

Не в идеале - чем выше значение тем хуже используется буфферный пул. Вообще ничего особо криминального не видно, хотя
Цитата(Bulat @  23.7.2008,  10:16 Найти цитируемый пост)

| Innodb_buffer_pool_pages_flushed  | 2832008   | -- The number of buffer pool page-flush requests.
| Innodb_buffer_pool_pages_free     | 0         | -- The number of free pages.
| Innodb_buffer_pool_reads          | 3674823   | -- The number of logical reads that InnoDB  could not satisfy from the buffer pool and had to do a single-page read

говорят о том, что все таки стоит попробовать уведичить пул. 
Попробуйте увеличить значение innodb_buffer_pool_size.

PM MAIL   Вверх
Bulat
Дата 23.7.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(sTa1kEr @  23.7.2008,  11:10 Найти цитируемый пост)
говорят о том, что все таки стоит попробовать уведичить пул. 
Попробуйте увеличить значение innodb_buffer_pool_size.

Ок, возьму на заметку.

Но похоже MuToGeN, попал в точку smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.