У меня есть таблица MySQL, в которой около 1,5 миллиона записей, а размер таблицы составляет 1,3 ГБ.
Я использую механизм мягкого удаления в этой таблице, что означает, что у меня есть столбец deleted_at
, который указывает, была ли строка удалена и когда. если запись не удалена, то deleted_at
значение равно NULL
Из этих 1,5 миллиона записей только 30 КБ не подлежат обратимому удалению. это означает, что к ним часто обращаются, в то время как к другим записям доступ почти не осуществляется, но в некоторых случаях это так.
Таким образом, эта таблица интенсивно используется и запрашивается для записей, которые не были удалены, а иногда и для записей, удаленных без возможности восстановления.
У меня есть тип индекса BTREE
для записи deleted_at
(с мощностью 35 КБ). Таблица со временем становится тяжелее, и очевидно, что это не масштабируемое решение.
Таблица движка MyISAM
. большинство других таблиц InnoDB
, но эта таблица сильно запрашивается с STORED PROCEDURE
, и когда я перешел на InnoDB
, запросы были намного медленнее.
Я ищу решение, которое не потребует замены оборудования. текущего оборудования достаточно для того, чтобы эта таблица имела хорошую производительность, но этого не произойдет, как только эта таблица вырастет еще больше.
Вещи, о которых я подумал:
- разбиение на разделы, но я не могу использовать
partitions
, поскольку некоторые столбцыFULL TEXT
проиндексированы. - разделить данные на две таблицы. один для удаленных строк и один для не удаленных строк, к которым часто обращались и которые запрашивали. это изменение требует значительных изменений инфраструктуры, поэтому я не тороплюсь с этим.
- создание новой таблицы, которая будет синхронизироваться с исходной таблицей один раз в 10/20 минут вместо разделения и будет содержать только не удаленные строки. это потребует небольших изменений инфраструктуры, а обслуживание станет намного проще и безопаснее. разделение на две таблицы может привести к отсутствию записей из-за сбоев запросов, поскольку операция «УДАЛИТЬ» фактически перемещает строку из одной таблицы в другую, и, следовательно, требует сложного механизма
Какие еще у меня есть варианты? я могу дать приоритет некоторым строкам в таблице с MySQL? память мудрая.
У меня 10.3.20-MariaDB
и 32 ГБ ОЗУ
10.3.20-MariaDB
и 32 ГБ ОЗУ - person jony89   schedule 03.02.2020FULLTEXT
существует для InnoDB в 10.3. (Фактически, начиная с 10.0.5) Ваша таблица достаточно мала, чтобы ее можно было легко кэшировать в ОЗУ. Таким образом, полная неэффективность выборки, а затем отбрасывания 98% желаемых строк не должна быть такой уж плохой. - person Rick James   schedule 03.02.2020FULLTEXT
. но у меня есть не такой простой запрос (включающий вычисление расстояний), который плохо работает сInnoDB
. Вы говорите, что после разделения таблиц имеет смысл перейти наInnoDB
? - person jony89   schedule 03.02.2020InnoDB
- person jony89   schedule 03.02.2020