|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
я понимаю, что сделано, как образчик гавно кода, но может быть есть возможность не перепиливая все как то оживить? итак, майскуль (v. 5.6), очень большая таблица(100-150 млн записей) в ней поле статус. большая часть поля статус, естественно, уже чтото типа "архив". нужно быстро отбирать записи с начальными статусами. их очень мало, не более 10000 в один момент времени типа Код: plsql 1. 2.
одновременно отбирается еще по паре полей с неплохой селективностью собственно что с этой таблицей сделать можно не перепиливая много кода? 1. секционирование? хотя бы по годам с отсечением архива? 2. какой то хитрый индекс? ну по типу индекса по функции оракла DECODE(status,'5','5','10','10'), когда для других значений статуса вернется null, а он не индексируется, что позволяет получить компактный индекс в котором есть ссылли только на нужные блоки? 3. как то закэшировать строки с нужными статусами? подкиньте плиз свеnлую мысль :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 09:45 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Партиционирование. Рекомендую для небольшого набора значений использовать List Partitioning . Соответственно запросы типа показанного не будут лезть в разделы, не соответствующие критерию. PartitionPruning . Или хотя бы создайте индекс по полю статуса. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 10:07 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Akina Или хотя бы создайте индекс по полю статуса. да просто индексы, естественно, есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 10:11 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Выбор 10к записей из 150М по индексу и фиксированному значению должен быть быстрым. На передачу выборки по сети на клиента уйдёт куда как больше времени... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 10:12 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Akina Выбор 10к записей из 150М по индексу и фиксированному значению должен быть быстрым. На передачу выборки по сети на клиента уйдёт куда как больше времени... это интернет магазин, в частности таблица это корзина и история заказов. когда тыщи людей одновременно выбирают свои корзины по статусу бывает кисло. нужно было бы конечно это в разных таблицах хранить, но это запасной вариант) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 10:47 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль когда тыщи людей одновременно выбирают свои корзины по статусу бывает кисло. Надфиль таблица это корзина и история заказов ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 11:10 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Akina Тогда тем более партиционирование. Индекс и актуальные разделы всегда будут горячими. вопрос по какому полю... и алгоритму дробить Akina Очень странно, что рабочие данные (корзина) и архивные данные (история) хранятся в одной таблице - тем более что и структура их явно различается, и история явно должна быть read-only. они и так ридонли (в смысле у простых смертных нет способа там поковыряться). хотя да сделано странно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 11:58 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль вопрос по какому полю... и алгоритму дробить С полем вопросов нет вообще - это есссно поле status. А за алгоритм - я ж дал ссылку не вообще на партиционирование, а на определённый алгоритм. У тебя ж значения в поле - дискретные, значит, LIST. Либо можно RANGE, если какие-то последовательные значения образуют группу, часто запрашиваемую целиком. Надфиль они и так ридонли (в смысле у простых смертных нет способа там поковыряться) Да ладно... в MySQL в принципе нет row-level security. А если что и ограничено на уровне клиентской части - так это до первого хацкера. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 12:16 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Akina С полем вопросов нет вообще - это есссно поле status. А за алгоритм - я ж дал ссылку не вообще на партиционирование, а на определённый алгоритм. У тебя ж значения в поле - дискретные, значит, LIST. Либо можно RANGE, если какие-то последовательные значения образуют группу, часто запрашиваемую целиком. те в майскуле пи смене моего статуса запись сама передет в другую партицию? слабо верится. пойду мануал почитаю. Akina Да ладно... в MySQL в принципе нет row-level security. А если что и ограничено на уровне клиентской части - так это до первого хацкера. это никому ни даст никакого профита. эта вспомогательная база через которую небольшой шлюз в интернет устроен. все остальное (и действительно ценное) внутри сети и в других базах. я вот пытаюсь выяснить вообще нужно ли это хранить с ветхозаветных времен. может просто удалять все старше года к едреной фене. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 12:26 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль слабо верится. пойду мануал почитаю. Надфиль может просто удалять все старше года к едреной фене. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 12:37 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Akina Удаление информации без возможности восстановления - вообще-то не лучшая идея. Вот переместить в отдельную архивную таблицу (а потом, если места мало, забэкапить её и грохнуть) - это можно. ее копия есть в недрах основоной системы. хотя и в несколько ином виде. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 12:40 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль Код: plsql 1.
status - varchar? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 13:38 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
вадя status - varchar? int2 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 14:56 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль int2 тогда IN ('5','10') что это? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 16:07 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
вадя тогда IN ('5','10') что это? это не "моё" творчество. но майскуль (как и большинство баз) справляется. план не поменялся, индекс используется. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 16:10 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль вадя тогда IN ('5','10') что это? это не "моё" творчество. но майскуль (как и большинство баз) справляется. план не поменялся, индекс используется. Огорчу. Та глубокая задница, которая возникает из сравнения INT поля и CHAR литерала, в плане не отображается... Вообще вопрос достойный. Попробуй сам сперва угадать, а потом проверить по документации: какой контекст имеет сравнение? Целочисленный? Строковый? Какой-то ещё? Правильный ответЗначения будут сравниваться как FLOAT. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 21:17 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль индекс используется. Akina Значения будут сравниваться как FLOAT. Надфиль, покажите план, пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2021, 23:44 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Куча вариантов: Партиционирование по статусу. Хранить строки с этим статусом в отдельной таблице, а для работы сделать view с union. Или то же самое, но без union - а просто тригерами добавлять строки с этим статусом в ещё одну таблицу и удалять из неё, при смене статуса. Составной частичный индекс, включающий только этот статус и все колонки, которые нужно выбирать и которые могут быть в условии. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 00:28 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль вадя status - varchar? int2 в этом случае индекс не должен срабатывать, если только там не происходит неявного преобразования типов '5' в 5. Но в теории наоборот, будет неявное преобразование колонки из int в varchar и full table scan. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 00:31 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
А вообще это вопрос в первую очередь к архитектуре хранилища, в таких случаях делают 2 таблицы: историческую и актуальную, в актуальной хранят последний день/неделю/месяц. И да, 150 млн строк лучше хранить в PostgreSQL, а не в MySQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 00:34 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
miksoft Надфиль, покажите план, пожалуйста. вот в виде скрина. говорит использую составной индекс (я его сделал первым делом). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 10:24 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль вот в виде скрина. говорит использую составной индекс (я его сделал первым делом). Для того запроса нужен индекс из одного поля status, либо хотя бы начинающийся с него составной индекс. А то, что показано в текущем плане, как я понимаю, полное сканирование индекса, что значительнее менее эффективно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 11:00 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
miksoft Это план от запроса в начальном посте, правильно? Для того запроса нужен индекс из одного поля status, либо хотя бы начинающийся с него составной индекс. А то, что показано в текущем плане, как я понимаю, полное сканирование индекса, что значительнее менее эффективно. первым полем стоит ид клиента, селективность там не плохая. на самом деле ощутимой разницы нет, составной индекс или просто по полю статус. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 11:06 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
Надфиль первым полем стоит ид клиента, селективность там не плохая. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 12:16 |
|
как бы это ускорить?
|
|||
---|---|---|---|
#18+
miksoft А толку, если в запросе это поле не используется? Почему не используется? используется поиск по двум полям (в данном случае), клиент и статус. Просто в первом примере запроса я привел фрагмент. Ранее был поиск только по одному статусу.потребовалось сделать сразу по двум. начались проблемы явные с производительностью. вариант с union all с двумя значениями тоже не очень здорово. вот и ищу какую нибудь хитрость, которая позволит дотянуть до глобальной переделки. вчера вот разрешили хранить это не более трех лет. (сейчас там с 2014 года). попробуем так плюс может партиции сделаю на таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2021, 14:12 |
|
|
start [/forum/topic.php?fid=47&msg=40098219&tid=1827938]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
25ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 144ms |
0 / 0 |