Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация выборки из таблицы ~100 000 000 строк / 25 сообщений из 26, страница 1 из 2
14.03.2017, 08:55
    #39418586
Onauses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Здравствуйте! Имеется огромная база данных, в ней есть таблица sessions (в ней столбцы loginID, hostID, date, url, traffic), которая содержит около 100 000 000 строк. Запрос:

SELECT * FROM sessions WHERE loginID="1" AND date BETWEEN STR_TO_DATE('2016-05-23 00:00:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2016-05-23 23:59:59', '%Y-%m-%d %H:%i:%s')

по временному промежутку занимает порядка 40 секунд на виртуалке 4 ядра от Xeon и 8гб ОЗУ. Как можно оптимизировать запрос, чтобы обрабатывал быстрее запросы?
...
Рейтинг: 0 / 0
14.03.2017, 09:17
    #39418594
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Запрос должен забирать все строки ровно за одни или несколько суток? Не уверен, что сильно поможет, можно для этой цели попробовать добавить в таблицу числовое поле с обозначением только даты и проиндексировать его.
Вообще, мало исходных данных. Какой движок использует таблица, каков её размер, висит ли она в памяти целиком или всякий раз с диска читается.
...
Рейтинг: 0 / 0
14.03.2017, 09:28
    #39418599
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
А так же какие есть индексы и сколько указанный запрос возвращает данных количественно.

Вероятно уместен индекс по loginId & date.
Если запросы к этой таблице почти всегда идут с указанием loginId - то это неплохой вариант для партицирования. Партицирование по дате тоже может быть вполне уместно.
...
Рейтинг: 0 / 0
14.03.2017, 09:46
    #39418611
Onauses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Сам сервер mysql - mariadb, индексы по loginId, hostId, date, login+date, traffic.

Может возможны варианты с разбивкой базы?
...
Рейтинг: 0 / 0
14.03.2017, 09:49
    #39418613
Onauses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
vkleЗапрос должен забирать все строки ровно за одни или несколько суток? Не уверен, что сильно поможет, можно для этой цели попробовать добавить в таблицу числовое поле с обозначением только даты и проиндексировать его.
Вообще, мало исходных данных. Какой движок использует таблица, каков её размер, висит ли она в памяти целиком или всякий раз с диска читается.

Запросы разные. По суткам, неделям, может месяцам. Движок MariaDB, остальные данные по дефолту. Размер базы около 10ГБ.
...
Рейтинг: 0 / 0
14.03.2017, 10:08
    #39418621
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
1) Сколько записей выбирается запросом? Действительно ли нужны сами записи, да ещё все сразу?
2) FAQ: Нахождение записей, где заданное значение находится между значениями полей
3) Покажите DDL.
4) Сколько SELECT COUNT(DISTINCT loginID) FROM sessions?
...
Рейтинг: 0 / 0
14.03.2017, 10:20
    #39418634
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
OnausesЗапросы разные. По суткам, неделям, может месяцам.Кратны ли периоды выборки целым суткам от нуля часов до без секунды полночь? Если нет (имеются значения времени, отличные от 00:00:00 и 23:59:59), то и нет смысла смотреть в эту сторону. Смысл тут в отдельном, небольшом индексе для даты.

OnausesДвижок MariaDBНичего не путаете? Это СУБД есть такая. Список поддерживаемых в ней движков: https://mariadb.com/kb/en/mariadb/storage-engines/
Скорее всего, MyISAM или InnoDB.
...
Рейтинг: 0 / 0
14.03.2017, 11:19
    #39418686
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
OnausesЗдравствуйте! Имеется огромная база данных, в ней есть таблица sessions (в ней столбцы loginID, hostID, date, url, traffic), которая содержит около 100 000 000 строк. Запрос:

SELECT * FROM sessions WHERE loginID="1" AND date BETWEEN STR_TO_DATE('2016-05-23 00:00:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2016-05-23 23:59:59', '%Y-%m-%d %H:%i:%s')

по временному промежутку занимает порядка 40 секунд на виртуалке 4 ядра от Xeon и 8гб ОЗУ. Как можно оптимизировать запрос, чтобы обрабатывал быстрее запросы?

0) Дай DDL таблицы.

1) сколько записей примерно должен вернуть этот запрос?
Посчитай
SELECT count(*) FROM sessions WHERE loginID="1" AND date BETWEEN STR_TO_DATE('2016-05-23 00:00:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2016-05-23 23:59:59', '%Y-%m-%d %H:%i:%s')
...
Рейтинг: 0 / 0
14.03.2017, 11:41
    #39418711
Onauses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Akina1) Сколько записей выбирается запросом? Действительно ли нужны сами записи, да ещё все сразу?
2) FAQ: Нахождение записей, где заданное значение находится между значениями полей
3) Покажите DDL.
4) Сколько SELECT COUNT(DISTINCT loginID) FROM sessions?

1) Мне самое главное получить url и traffic
3) Я новичок, не совсем понимаю, извините(
4) 171
...
Рейтинг: 0 / 0
14.03.2017, 11:44
    #39418716
Onauses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
vkleOnausesЗапросы разные. По суткам, неделям, может месяцам.Кратны ли периоды выборки целым суткам от нуля часов до без секунды полночь? Если нет (имеются значения времени, отличные от 00:00:00 и 23:59:59), то и нет смысла смотреть в эту сторону. Смысл тут в отдельном, небольшом индексе для даты.

OnausesДвижок MariaDBНичего не путаете? Это СУБД есть такая. Список поддерживаемых в ней движков: https://mariadb.com/kb/en/mariadb/storage-engines/
Скорее всего, MyISAM или InnoDB.

Извините, InnoDB. Запрос кратный суткам, нескольким суткам, неделе и т.д.
...
Рейтинг: 0 / 0
14.03.2017, 11:47
    #39418720
Onauses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
MasterZiv,

Вернул 0 )))
...
Рейтинг: 0 / 0
14.03.2017, 11:51
    #39418727
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Onauses1) Мне самое главное получить url и traffic
Ну так и выбирайте только их, а не все поля. Зачем лишние мегабайты по сети гонять?

Onauses3) Я новичок, не совсем понимаю, извините(
Код: sql
1.
SHOW CREATE TABLE sessions;


Результат в студию.
...
Рейтинг: 0 / 0
14.03.2017, 11:59
    #39418734
Onauses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
AkinaРезультат в студию.
CREATE TABLE `sessions` (
`loginID` int(11) NOT NULL,
`hostID` int(11) NOT NULL,
`date` datetime NOT NULL,
`url` text COLLATE utf8_bin NOT NULL,
`traffic` int(11) NOT NULL,
KEY `loginID` (`loginID`),
KEY `hostID` (`hostID`),
KEY `date` (`date`),
KEY `login+date` (`loginID`,`hostID`),
KEY `traf` (`traffic`),
CONSTRAINT `sessions_ibfk_1` FOREIGN KEY (`hostID`) REFERENCES `hosts` (`hostID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sessions_ibfk_2` FOREIGN KEY (`loginID`) REFERENCES `logins` (`loginID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
...
Рейтинг: 0 / 0
14.03.2017, 12:57
    #39418813
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
OnausesKEY `login+ date ` (`loginID`,` hostID `)
...
Рейтинг: 0 / 0
14.03.2017, 15:28
    #39419008
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
OnausesИзвините, InnoDB.InnoDB умеет держать всю таблицу в оперативной памяти. Конечно, только в том случае, когда этой самой памяти достаточно.
Вы упоминали, что база (или Вы имели в виду таблицу?) целиком имеет объем больше, чем имеется памяти на сервере. В таком случае база целиком гарантировано не лезет в память и неиспользуемые данные будут со временем вымываться из памяти. Соответственно, вполне вероятно что при относительно редких запросах диску придется всякий раз шуршать головками, читая необходимые данные с диска. А это операция медленная.
...
Рейтинг: 0 / 0
14.03.2017, 19:16
    #39419245
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Onauses,

А первичного ключа у таблицы нет?
...
Рейтинг: 0 / 0
14.03.2017, 19:21
    #39419256
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Имхо, нужен индекс (loginID, `date`), а запрос переписать так:
Код: sql
1.
SELECT * FROM sessions WHERE loginID=1 AND date = '2016-05-23'
...
Рейтинг: 0 / 0
15.03.2017, 08:07
    #39419442
Onauses
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
miksoftИмхо, нужен индекс (loginID, `date`), а запрос переписать так:
Код: sql
1.
SELECT * FROM sessions WHERE loginID=1 AND date = '2016-05-23'



Такой запрос почему-то не работает. Возвращает 0.
...
Рейтинг: 0 / 0
15.03.2017, 08:31
    #39419453
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
miksoftзапрос переписать такУ него поле date имеет тип DATETIME и содержит компоненту времени. Так что не получится. А DATE(date) = '2016-05-23' - это ой...

С учётом объёма данных и задачи это как раз тот редкий случай, когда разделение поля DATETIME на два (или переопределённые данные и дополнительное поле типа DATE) может быть оправдано.
...
Рейтинг: 0 / 0
15.03.2017, 13:45
    #39419920
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Akinamiksoftзапрос переписать такУ него поле date имеет тип DATETIME и содержит компоненту времени. Так что не получится. А DATE(date) = '2016-05-23' - это ой...

С учётом объёма данных и задачи это как раз тот редкий случай, когда разделение поля DATETIME на два (или переопределённые данные и дополнительное поле типа DATE) может быть оправдано.

Ну, betwen тоже может быстро работать, если диапазон небольшой относительно всей таблицы.
...
Рейтинг: 0 / 0
16.03.2017, 00:18
    #39420395
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
Akinamiksoftзапрос переписать такУ него поле date имеет тип DATETIME и содержит компоненту времени. Так что не получится.Да, это я на имя поля повелся.
Тогда так:
Код: sql
1.
SELECT * FROM sessions WHERE loginID=1 AND date >= '2016-05-23 00:00:00' AND date < '2016-05-24 00:00:00' 
...
Рейтинг: 0 / 0
16.03.2017, 00:53
    #39420402
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
miksoftТогда так:
Код: sql
1.
SELECT * FROM sessions WHERE loginID=1 AND date >= '2016-05-23 00:00:00' AND date < '2016-05-24 00:00:00' 

Различия есть, но чем оно принципиально лучше/хуже запроса из первого поста?
OnausesSELECT * FROM sessions WHERE loginID="1" AND date BETWEEN STR_TO_DATE('2016-05-23 00:00:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2016-05-23 23:59:59', '%Y-%m-%d %H:%i:%s')
...
Рейтинг: 0 / 0
16.03.2017, 04:08
    #39420416
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
OnausesЗдравствуйте! Имеется огромная база данных, в ней есть таблица sessions (в ней столбцы loginID, hostID, date, url, traffic), которая содержит около 100 000 000 строк. Запрос:

SELECT * FROM sessions WHERE loginID="1" AND date BETWEEN STR_TO_DATE('2016-05-23 00:00:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2016-05-23 23:59:59', '%Y-%m-%d %H:%i:%s')

по временному промежутку занимает порядка 40 секунд на виртуалке 4 ядра от Xeon и 8гб ОЗУ. Как можно оптимизировать запрос, чтобы обрабатывал быстрее запросы?


...добавьте несколько полей (все - интегер):
дата YYYYMMDD int
год YYYY int
годмесяц YYYYMM int
3-отдельных индекса и строите запросы по новым полям.

если нужны агреагаты -- делайте пре-агрегированые таблицы.
Или сразу шагайте в сторону OLAP.
...
Рейтинг: 0 / 0
16.03.2017, 07:02
    #39420433
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
vklemiksoftТогда так:
Код: sql
1.
SELECT * FROM sessions WHERE loginID=1 AND date >= '2016-05-23 00:00:00' AND date < '2016-05-24 00:00:00' 


Различия есть, но чем оно принципиально лучше/хуже запроса из первого поста?
OnausesSELECT * FROM sessions WHERE loginID="1" AND date BETWEEN STR_TO_DATE('2016-05-23 00:00:00', '%Y-%m-%d %H:%i:%s') AND STR_TO_DATE('2016-05-23 23:59:59', '%Y-%m-%d %H:%i:%s')Принципиально - ничем.
Но лучше читается, более корректно обращается с последней секундой суток (на случай, если дата будет содержать дробные секунды) и, возможно, указание явных констант без вызова функций облегчит жизнь оптимизатору при оценке кардинальности результата (но это совсем не точно).
...
Рейтинг: 0 / 0
16.03.2017, 22:32
    #39421090
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки из таблицы ~100 000 000 строк
miksoftНо лучше читается, более корректно обращается с последней секундой суток (на случай, если дата будет содержать дробные секунды)Однозначно, согласен.


miksoftвозможно, указание явных констант без вызова функций облегчит жизнь оптимизатору при оценке кардинальности результата (но это совсем не точно).Вот тут я не владею в достаточной степени тонкостями внутренней кухни мускуля. Если где ошибаюсь - поправьте сразу, пожалуйста.
Предположу, что вариант ТС выполнит однократное явное преобразование строки во внутреннее представление даты. Ну а далее выполняется сравнение данных одного типа. С этим как-то ясно-понятно. Ваш вариант, врзможно, потребует какого-то принятия решения о неявном преобразовании "что во что конвертить" перед сравнением и, затем, наверняка, будет выбрано преобразование строки в дату и далее уже как и в варианте ТС. Вот тут конечный результат подготовки тоже одинаковым выходит.
Так вот, если отбросить человеческий фактор "лучше читается" и способ задания границ выборки, но оставить лишь рассмотрение с машинной точки зрения, если так можно выразиться, то можно, полагаю, считать вариант ТС более удобным. Или же, это всё такие мелочи, на которые можно не обращать внимания?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация выборки из таблицы ~100 000 000 строк / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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