powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Простой запрос вешает mysql на небольшой базе. Почему так?
11 сообщений из 11, страница 1 из 1
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402378
Victor256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Ничего как говорится, не предвещало...
База во вложении, там и полутора тысяч строк не наберётся. Запрос примитивный. Нужно выбрать из разных таблиц информацию, используя в т.ч. дату.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT
  i.issue_text_id AS issue_text_id,
  i.title AS issue_title,
  it.type_text AS issue_type,
  p.name AS project_name,
  u.user_name AS user_name,
  iw.*
FROM
  issues AS i,
  issues_worktimes AS iw,
  issue_types AS it,
  projects AS p,
  users AS u
WHERE
  iw.issue_id=i.id AND
  i.project_id=p.id AND
  iw.issue_type_id=it.id AND
  iw.user_id=u.id AND
  iw.work_time>=300 AND
--  (iw.time_start<'2017-02-09 00:00:00' AND (iw.time_stop>'2017-02-09 23:59:59' OR iw.last_connect_time>'2017-02-09 23:59:59')) OR
  (iw.time_start>='2017-02-09 00:00:00' AND (iw.time_start<='2017-02-09 23:59:59' OR iw.last_connect_time<='2017-02-09 23:59:59'))
ORDER BY iw.user_id ASC, iw.id ASC


Думаю из текста запроса всё понятно, поясню лишь последние две строчки. В таблице issues_worktimes хранится время работы пользователя: дата-время начала и окончания. На определённый день выбирается статистика, в данном случае на 9-е число. Нужно показать всех пользователей, работавших в этот день. Последняя строка запроса выбирает пользователей начавших работать в этот день, предпоследняя - начавших работать раньше заданной даты и окончивших работу после её.

Так вот, после того как я дописал закоментированную строку, mysql стала свопить диск и вешаться. В списке процессов, в поле state написано "copying to tmp table on disk". Пробовал и локально, и на хорошем хостинге, результат один - запрос неработоспособен. Причём по отдельности две последние строки работают нормально. Игрался с настройками my.ini, не помогает. Запрос отъедает всю выделенную память, и начинает свопить диск. Таблицы с внешними ключами, если это имеет значение.

план запроса:
Код: sql
1.
2.
3.
4.
5.
6.
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	u	ALL	PRIMARY	NULL	NULL	NULL	12	Using temporary; Using filesort
1	SIMPLE	p	ALL	PRIMARY	NULL	NULL	NULL	76	Using join buffer
1	SIMPLE	it	ALL	PRIMARY	NULL	NULL	NULL	92	Using join buffer
1	SIMPLE	iw	ALL	issue_id,user_id,time_start,issue_type_id,work_time,time_stop	NULL	NULL	NULL	1153	Using where; Using join buffer
1	SIMPLE	i	ALL	PRIMARY,user_id	NULL	NULL	NULL	573	Using where; Using join buffer



Прошу помощи профи, и разъяснения, что я такого страшного написал? Первый раз сталкиваюсь с таким поведением сервера.
Локальная версия: Ver 14.14 Distrib 5.5.45, for Win32 (x86)
На хостинге: Ver 14.14 Distrib 5.5.54, for debian-linux-gnu (x86_64) using readline 6.2
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402410
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
possible_keys NULL - вот причина. А также OR в условиях отбора - перепиши на UNION.
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402435
Victor256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinapossible_keys NULL - вот причина. А также OR в условиях отбора - перепиши на UNION.
А что ключи, они по всем полям стоят. Пробовал и составные и всякие.
UNION помог, но ради одной строчки в условии дописывать копию запроса...
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402516
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor256UNION помог, но ради одной строчки в условии дописывать копию запроса...
Вот то есть заставить сервер пыхтеть, а пользователя сосать лапу - это нормально, а дописать копию запроса программистская гордость не позволяет... приоритеты надо тщательнее выбирать.
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402543
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor256Akinapossible_keys NULL - вот причина. А также OR в условиях отбора - перепиши на UNION.
А что ключи, они по всем полям стоят. Пробовал и составные и всякие.
UNION помог, но ради одной строчки в условии дописывать копию запроса...

молодой...
:-)
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402545
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor256Добрый день. Ничего как говорится, не предвещало...
База во вложении, там и полутора тысяч строк не наберётся. Запрос примитивный.
FROM
issues AS i,
issues_worktimes AS iw,
issue_types AS it,
projects AS p,
users AS u



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

положим, у тебя нет индексов вообще, а не только для одной пары таблиц,

сколько записей тогда надо будет обработать?

issues AS i,
issues_worktimes AS iw,

,каждая по 1тыс, 1000 *1000=1000000,

следующая таблица - еще *1000 = миллиард,
еще одна таблица еще *1000 = 1000 миллиардов,
еще одна таблица еще *1000 = миллион миллиардов записей тебе надо обработать, чтобы выполнить твой запрос, Если ты не будешь создавать индексы!

1000**5 = 10**15 строк,
а ты говоришь "простой запрос"
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402549
anuta123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaVictor256UNION помог, но ради одной строчки в условии дописывать копию запроса...
Вот то есть заставить сервер пыхтеть, а пользователя сосать лапу - это нормально, а дописать копию запроса программистская гордость не позволяет... приоритеты надо тщательнее выбирать.
глупые какие-то слова. Я спрашивал, кроме юниона есть варианты? Условий по дате будет ещё много.
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402550
anuta123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
положим, у тебя нет индексов вообще, а не только для одной пары таблиц,
положим индексы есть. Может, не такие как надо. Ну так на то и форум.
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39402826
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anuta123кроме юниона есть варианты? Условий по дате будет ещё многоЕсть, есть... расплести условия, перейти на R-Tree, конвертировать время в геометрию, изменить структуру хранения, перейти на промышленную СУБД... достаточно? или ещё пару-тройку подкинуть?

anuta123глупые какие-то словаГлупо - это, мотивируя какими-то мифическими некрасивостями, создавать неэффективный код.

anuta123индексы есть. Может, не такие как надоИными словами, индексов нет. Неужели даже это недоступно к пониманию?
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39403453
Victor256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaanuta123кроме юниона есть варианты? Условий по дате будет ещё многоЕсть, есть... расплести условия, перейти на R-Tree, конвертировать время в геометрию, изменить структуру хранения, перейти на промышленную СУБД... достаточно? или ещё пару-тройку подкинуть?

anuta123глупые какие-то словаГлупо - это, мотивируя какими-то мифическими некрасивостями, создавать неэффективный код.

anuta123индексы есть. Может, не такие как надоИными словами, индексов нет. Неужели даже это недоступно к пониманию?

Хоть и в извращенной форме, но спасибо за помощь.
...
Рейтинг: 0 / 0
Простой запрос вешает mysql на небольшой базе. Почему так?
    #39403506
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Victor256,
если правильно понял задачу, то запрос должен быть примерно таким
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
  i.issue_text_id AS issue_text_id,
  i.title AS issue_title,
  it.type_text AS issue_type,
  p.name AS project_name,
  u.user_name AS user_name,
  iw.*
FROM issues AS i
JOIN issues_worktimes AS iw ON iw.issue_id=i.id
JOIN issue_types AS it ON iw.issue_type_id=it.id
JOIN projects AS p ON i.project_id=p.id
JOIN users AS u ON iw.user_id=u.id
WHERE iw.work_time>=300 AND  
  iw.time_start<'2017-02-10' AND iw.time_stop>='2017-02-09'
ORDER BY iw.user_id ASC, iw.id ASC
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Простой запрос вешает mysql на небольшой базе. Почему так?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]