powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как бы это ускорить?
25 сообщений из 27, страница 1 из 2
как бы это ускорить?
    #40098211
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я понимаю, что сделано, как образчик гавно кода, но может быть есть возможность не перепиливая все как то оживить?

итак, майскуль (v. 5.6), очень большая таблица(100-150 млн записей) в ней поле статус.
большая часть поля статус, естественно, уже чтото типа "архив". нужно быстро отбирать записи с начальными статусами. их очень мало, не более 10000 в один момент времени типа

Код: plsql
1.
2.
select * from tt
where status IN ('5','10') 


одновременно отбирается еще по паре полей с неплохой селективностью
собственно что с этой таблицей сделать можно не перепиливая много кода?
1. секционирование? хотя бы по годам с отсечением архива?
2. какой то хитрый индекс? ну по типу индекса по функции оракла DECODE(status,'5','5','10','10'), когда для других значений статуса вернется null, а он не индексируется, что позволяет получить компактный индекс в котором есть ссылли только на нужные блоки?
3. как то закэшировать строки с нужными статусами?

подкиньте плиз свеnлую мысль :-)
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098219
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Партиционирование. Рекомендую для небольшого набора значений использовать List Partitioning . Соответственно запросы типа показанного не будут лезть в разделы, не соответствующие критерию. PartitionPruning .

Или хотя бы создайте индекс по полю статуса.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098221
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina

Или хотя бы создайте индекс по полю статуса.

да просто индексы, естественно, есть.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098222
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбор 10к записей из 150М по индексу и фиксированному значению должен быть быстрым. На передачу выборки по сети на клиента уйдёт куда как больше времени...
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098231
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Выбор 10к записей из 150М по индексу и фиксированному значению должен быть быстрым. На передачу выборки по сети на клиента уйдёт куда как больше времени...

это интернет магазин, в частности таблица это корзина и история заказов.
когда тыщи людей одновременно выбирают свои корзины по статусу бывает кисло.
нужно было бы конечно это в разных таблицах хранить, но это запасной вариант)
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098248
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
когда тыщи людей одновременно выбирают свои корзины по статусу бывает кисло.
Тогда тем более партиционирование. Индекс и актуальные разделы всегда будут горячими.
Надфиль
таблица это корзина и история заказов
Очень странно, что рабочие данные (корзина) и архивные данные (история) хранятся в одной таблице - тем более что и структура их явно различается, и история явно должна быть read-only.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098271
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Тогда тем более партиционирование. Индекс и актуальные разделы всегда будут горячими.

вопрос по какому полю... и алгоритму дробить

Akina
Очень странно, что рабочие данные (корзина) и архивные данные (история) хранятся в одной таблице - тем более что и структура их явно различается, и история явно должна быть read-only.

они и так ридонли (в смысле у простых смертных нет способа там поковыряться). хотя да сделано странно.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098277
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
вопрос по какому полю... и алгоритму дробить

С полем вопросов нет вообще - это есссно поле status.
А за алгоритм - я ж дал ссылку не вообще на партиционирование, а на определённый алгоритм. У тебя ж значения в поле - дискретные, значит, LIST. Либо можно RANGE, если какие-то последовательные значения образуют группу, часто запрашиваемую целиком.

Надфиль
они и так ридонли (в смысле у простых смертных нет способа там поковыряться)

Да ладно... в MySQL в принципе нет row-level security. А если что и ограничено на уровне клиентской части - так это до первого хацкера.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098279
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina

С полем вопросов нет вообще - это есссно поле status.
А за алгоритм - я ж дал ссылку не вообще на партиционирование, а на определённый алгоритм. У тебя ж значения в поле - дискретные, значит, LIST. Либо можно RANGE, если какие-то последовательные значения образуют группу, часто запрашиваемую целиком.

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

Akina

Да ладно... в MySQL в принципе нет row-level security. А если что и ограничено на уровне клиентской части - так это до первого хацкера.

это никому ни даст никакого профита. эта вспомогательная база через которую небольшой шлюз в интернет устроен. все остальное (и действительно ценное) внутри сети и в других базах.
я вот пытаюсь выяснить вообще нужно ли это хранить с ветхозаветных времен. может просто удалять все старше года к едреной фене.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098283
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
слабо верится. пойду мануал почитаю.
Зря. Но почитать всегда полезно.

Надфиль
может просто удалять все старше года к едреной фене.
Удаление информации без возможности восстановления - вообще-то не лучшая идея. Вот переместить в отдельную архивную таблицу (а потом, если места мало, забэкапить её и грохнуть) - это можно.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098285
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Удаление информации без возможности восстановления - вообще-то не лучшая идея. Вот переместить в отдельную архивную таблицу (а потом, если места мало, забэкапить её и грохнуть) - это можно.

ее копия есть в недрах основоной системы. хотя и в несколько ином виде.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098300
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
Код: plsql
1.
where status IN ('5','10') 


status - varchar?
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098330
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя

status - varchar?

int2
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098357
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
int2

тогда IN ('5','10') что это?
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098358
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя

тогда IN ('5','10') что это?

это не "моё" творчество.
но майскуль (как и большинство баз) справляется. план не поменялся, индекс используется.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098396
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
вадя

тогда IN ('5','10') что это?

это не "моё" творчество.
но майскуль (как и большинство баз) справляется. план не поменялся, индекс используется.

Огорчу. Та глубокая задница, которая возникает из сравнения INT поля и CHAR литерала, в плане не отображается...


Вообще вопрос достойный. Попробуй сам сперва угадать, а потом проверить по документации: какой контекст имеет сравнение? Целочисленный? Строковый? Какой-то ещё?

Правильный ответЗначения будут сравниваться как FLOAT.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098399
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
индекс используется.
Akina
Значения будут сравниваться как FLOAT.
Мне кажется, или одно несовместимо с другим?



Надфиль, покажите план, пожалуйста.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098406
Александр Бердышев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Куча вариантов:
Партиционирование по статусу.
Хранить строки с этим статусом в отдельной таблице, а для работы сделать view с union.
Или то же самое, но без union - а просто тригерами добавлять строки с этим статусом в ещё одну таблицу и удалять из неё, при смене статуса.
Составной частичный индекс, включающий только этот статус и все колонки, которые нужно выбирать и которые могут быть в условии.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098407
Александр Бердышев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
вадя

status - varchar?

int2

в этом случае индекс не должен срабатывать, если только там не происходит неявного преобразования типов '5' в 5.
Но в теории наоборот, будет неявное преобразование колонки из int в varchar и full table scan.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098408
Александр Бердышев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще это вопрос в первую очередь к архитектуре хранилища, в таких случаях делают 2 таблицы: историческую и актуальную, в актуальной хранят последний день/неделю/месяц.
И да, 150 млн строк лучше хранить в PostgreSQL, а не в MySQL.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098432
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft

Надфиль, покажите план, пожалуйста.


вот в виде скрина.
говорит использую составной индекс (я его сделал первым делом).
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098435
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
вот в виде скрина.
говорит использую составной индекс (я его сделал первым делом).
Это план от запроса в начальном посте, правильно?

Для того запроса нужен индекс из одного поля status, либо хотя бы начинающийся с него составной индекс.
А то, что показано в текущем плане, как я понимаю, полное сканирование индекса, что значительнее менее эффективно.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098436
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
Это план от запроса в начальном посте, правильно?

Для того запроса нужен индекс из одного поля status, либо хотя бы начинающийся с него составной индекс.
А то, что показано в текущем плане, как я понимаю, полное сканирование индекса, что значительнее менее эффективно.

первым полем стоит ид клиента, селективность там не плохая.
на самом деле ощутимой разницы нет, составной индекс или просто по полю статус.
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098440
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надфиль
первым полем стоит ид клиента, селективность там не плохая.
А толку, если в запросе это поле не используется?
...
Рейтинг: 0 / 0
как бы это ускорить?
    #40098445
Надфиль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
А толку, если в запросе это поле не используется?

Почему не используется? используется поиск по двум полям (в данном случае), клиент и статус.
Просто в первом примере запроса я привел фрагмент.
Ранее был поиск только по одному статусу.потребовалось сделать сразу по двум. начались проблемы явные с производительностью.
вариант с union all с двумя значениями тоже не очень здорово.
вот и ищу какую нибудь хитрость, которая позволит дотянуть до глобальной переделки.
вчера вот разрешили хранить это не более трех лет. (сейчас там с 2014 года). попробуем так плюс может партиции сделаю на таблице.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как бы это ускорить?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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