powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация выборки из таблицы ~100 000 000 строк
26 сообщений из 26, показаны все 2 страниц
Оптимизация выборки из таблицы ~100 000 000 строк
    #39418586
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 / 0
Оптимизация выборки из таблицы ~100 000 000 строк
    #39418594
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запрос должен забирать все строки ровно за одни или несколько суток? Не уверен, что сильно поможет, можно для этой цели попробовать добавить в таблицу числовое поле с обозначением только даты и проиндексировать его.
Вообще, мало исходных данных. Какой движок использует таблица, каков её размер, висит ли она в памяти целиком или всякий раз с диска читается.
...
Рейтинг: 0 / 0
Оптимизация выборки из таблицы ~100 000 000 строк
    #39418599
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так же какие есть индексы и сколько указанный запрос возвращает данных количественно.

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

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

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

OnausesДвижок MariaDBНичего не путаете? Это СУБД есть такая. Список поддерживаемых в ней движков: https://mariadb.com/kb/en/mariadb/storage-engines/
Скорее всего, MyISAM или InnoDB.
...
Рейтинг: 0 / 0
Оптимизация выборки из таблицы ~100 000 000 строк
    #39418686
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оптимизация выборки из таблицы ~100 000 000 строк
    #39418711
Onauses
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina1) Сколько записей выбирается запросом? Действительно ли нужны сами записи, да ещё все сразу?
2) FAQ: Нахождение записей, где заданное значение находится между значениями полей
3) Покажите DDL.
4) Сколько SELECT COUNT(DISTINCT loginID) FROM sessions?

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

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

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

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

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


Результат в студию.
...
Рейтинг: 0 / 0
Оптимизация выборки из таблицы ~100 000 000 строк
    #39418734
Onauses
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Оптимизация выборки из таблицы ~100 000 000 строк
    #39418813
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OnausesKEY `login+ date ` (`loginID`,` hostID `)
...
Рейтинг: 0 / 0
Оптимизация выборки из таблицы ~100 000 000 строк
    #39419008
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OnausesИзвините, InnoDB.InnoDB умеет держать всю таблицу в оперативной памяти. Конечно, только в том случае, когда этой самой памяти достаточно.
Вы упоминали, что база (или Вы имели в виду таблицу?) целиком имеет объем больше, чем имеется памяти на сервере. В таком случае база целиком гарантировано не лезет в память и неиспользуемые данные будут со временем вымываться из памяти. Соответственно, вполне вероятно что при относительно редких запросах диску придется всякий раз шуршать головками, читая необходимые данные с диска. А это операция медленная.
...
Рейтинг: 0 / 0
Оптимизация выборки из таблицы ~100 000 000 строк
    #39419245
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Onauses,

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



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

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

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

Ну, betwen тоже может быстро работать, если диапазон небольшой относительно всей таблицы.
...
Рейтинг: 0 / 0
Оптимизация выборки из таблицы ~100 000 000 строк
    #39420395
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оптимизация выборки из таблицы ~100 000 000 строк
    #39420402
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оптимизация выборки из таблицы ~100 000 000 строк
    #39420416
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оптимизация выборки из таблицы ~100 000 000 строк
    #39420433
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Оптимизация выборки из таблицы ~100 000 000 строк
    #39421090
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftНо лучше читается, более корректно обращается с последней секундой суток (на случай, если дата будет содержать дробные секунды)Однозначно, согласен.


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


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