Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Имеется огромная база данных, в ней есть таблица 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гб ОЗУ. Как можно оптимизировать запрос, чтобы обрабатывал быстрее запросы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 08:55 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Запрос должен забирать все строки ровно за одни или несколько суток? Не уверен, что сильно поможет, можно для этой цели попробовать добавить в таблицу числовое поле с обозначением только даты и проиндексировать его. Вообще, мало исходных данных. Какой движок использует таблица, каков её размер, висит ли она в памяти целиком или всякий раз с диска читается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 09:17 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
А так же какие есть индексы и сколько указанный запрос возвращает данных количественно. Вероятно уместен индекс по loginId & date. Если запросы к этой таблице почти всегда идут с указанием loginId - то это неплохой вариант для партицирования. Партицирование по дате тоже может быть вполне уместно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 09:28 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Сам сервер mysql - mariadb, индексы по loginId, hostId, date, login+date, traffic. Может возможны варианты с разбивкой базы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 09:46 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
vkleЗапрос должен забирать все строки ровно за одни или несколько суток? Не уверен, что сильно поможет, можно для этой цели попробовать добавить в таблицу числовое поле с обозначением только даты и проиндексировать его. Вообще, мало исходных данных. Какой движок использует таблица, каков её размер, висит ли она в памяти целиком или всякий раз с диска читается. Запросы разные. По суткам, неделям, может месяцам. Движок MariaDB, остальные данные по дефолту. Размер базы около 10ГБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 09:49 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
1) Сколько записей выбирается запросом? Действительно ли нужны сами записи, да ещё все сразу? 2) FAQ: Нахождение записей, где заданное значение находится между значениями полей 3) Покажите DDL. 4) Сколько SELECT COUNT(DISTINCT loginID) FROM sessions? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 10:08 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
OnausesЗапросы разные. По суткам, неделям, может месяцам.Кратны ли периоды выборки целым суткам от нуля часов до без секунды полночь? Если нет (имеются значения времени, отличные от 00:00:00 и 23:59:59), то и нет смысла смотреть в эту сторону. Смысл тут в отдельном, небольшом индексе для даты. OnausesДвижок MariaDBНичего не путаете? Это СУБД есть такая. Список поддерживаемых в ней движков: https://mariadb.com/kb/en/mariadb/storage-engines/ Скорее всего, MyISAM или InnoDB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 10:20 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
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') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 11:19 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Akina1) Сколько записей выбирается запросом? Действительно ли нужны сами записи, да ещё все сразу? 2) FAQ: Нахождение записей, где заданное значение находится между значениями полей 3) Покажите DDL. 4) Сколько SELECT COUNT(DISTINCT loginID) FROM sessions? 1) Мне самое главное получить url и traffic 3) Я новичок, не совсем понимаю, извините( 4) 171 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 11:41 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
vkleOnausesЗапросы разные. По суткам, неделям, может месяцам.Кратны ли периоды выборки целым суткам от нуля часов до без секунды полночь? Если нет (имеются значения времени, отличные от 00:00:00 и 23:59:59), то и нет смысла смотреть в эту сторону. Смысл тут в отдельном, небольшом индексе для даты. OnausesДвижок MariaDBНичего не путаете? Это СУБД есть такая. Список поддерживаемых в ней движков: https://mariadb.com/kb/en/mariadb/storage-engines/ Скорее всего, MyISAM или InnoDB. Извините, InnoDB. Запрос кратный суткам, нескольким суткам, неделе и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 11:44 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Вернул 0 ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 11:47 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Onauses1) Мне самое главное получить url и traffic Ну так и выбирайте только их, а не все поля. Зачем лишние мегабайты по сети гонять? Onauses3) Я новичок, не совсем понимаю, извините( Код: sql 1. Результат в студию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 11:51 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 11:59 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
OnausesKEY `login+ date ` (`loginID`,` hostID `) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 12:57 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
OnausesИзвините, InnoDB.InnoDB умеет держать всю таблицу в оперативной памяти. Конечно, только в том случае, когда этой самой памяти достаточно. Вы упоминали, что база (или Вы имели в виду таблицу?) целиком имеет объем больше, чем имеется памяти на сервере. В таком случае база целиком гарантировано не лезет в память и неиспользуемые данные будут со временем вымываться из памяти. Соответственно, вполне вероятно что при относительно редких запросах диску придется всякий раз шуршать головками, читая необходимые данные с диска. А это операция медленная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 15:28 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Onauses, А первичного ключа у таблицы нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 19:16 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Имхо, нужен индекс (loginID, `date`), а запрос переписать так: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2017, 19:21 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
miksoftИмхо, нужен индекс (loginID, `date`), а запрос переписать так: Код: sql 1. Такой запрос почему-то не работает. Возвращает 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 08:07 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
miksoftзапрос переписать такУ него поле date имеет тип DATETIME и содержит компоненту времени. Так что не получится. А DATE(date) = '2016-05-23' - это ой... С учётом объёма данных и задачи это как раз тот редкий случай, когда разделение поля DATETIME на два (или переопределённые данные и дополнительное поле типа DATE) может быть оправдано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 08:31 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Akinamiksoftзапрос переписать такУ него поле date имеет тип DATETIME и содержит компоненту времени. Так что не получится. А DATE(date) = '2016-05-23' - это ой... С учётом объёма данных и задачи это как раз тот редкий случай, когда разделение поля DATETIME на два (или переопределённые данные и дополнительное поле типа DATE) может быть оправдано. Ну, betwen тоже может быстро работать, если диапазон небольшой относительно всей таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2017, 13:45 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
Akinamiksoftзапрос переписать такУ него поле date имеет тип DATETIME и содержит компоненту времени. Так что не получится.Да, это я на имя поля повелся. Тогда так: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 00:18 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
miksoftТогда так: Код: sql 1. Различия есть, но чем оно принципиально лучше/хуже запроса из первого поста? 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') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 00:53 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 04:08 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
vklemiksoftТогда так: Код: sql 1. Различия есть, но чем оно принципиально лучше/хуже запроса из первого поста? 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')Принципиально - ничем. Но лучше читается, более корректно обращается с последней секундой суток (на случай, если дата будет содержать дробные секунды) и, возможно, указание явных констант без вызова функций облегчит жизнь оптимизатору при оценке кардинальности результата (но это совсем не точно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 07:02 |
|
||
|
Оптимизация выборки из таблицы ~100 000 000 строк
|
|||
|---|---|---|---|
|
#18+
miksoftНо лучше читается, более корректно обращается с последней секундой суток (на случай, если дата будет содержать дробные секунды)Однозначно, согласен. miksoftвозможно, указание явных констант без вызова функций облегчит жизнь оптимизатору при оценке кардинальности результата (но это совсем не точно).Вот тут я не владею в достаточной степени тонкостями внутренней кухни мускуля. Если где ошибаюсь - поправьте сразу, пожалуйста. Предположу, что вариант ТС выполнит однократное явное преобразование строки во внутреннее представление даты. Ну а далее выполняется сравнение данных одного типа. С этим как-то ясно-понятно. Ваш вариант, врзможно, потребует какого-то принятия решения о неявном преобразовании "что во что конвертить" перед сравнением и, затем, наверняка, будет выбрано преобразование строки в дату и далее уже как и в варианте ТС. Вот тут конечный результат подготовки тоже одинаковым выходит. Так вот, если отбросить человеческий фактор "лучше читается" и способ задания границ выборки, но оставить лишь рассмотрение с машинной точки зрения, если так можно выразиться, то можно, полагаю, считать вариант ТС более удобным. Или же, это всё такие мелочи, на которые можно не обращать внимания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2017, 22:32 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39418711&tid=1830834]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 374ms |

| 0 / 0 |
