mysql — Как удалить много данных условием WHERE на поле с индексом на большой и нагруженной таблице?

Вопрос задан

Изменён 1 год 1 месяц назад

Просмотрен 208 раз

Задача чисто теоретическая, поэтому тонкости можно не уточнять. А если от тонкостей что-то зависит, то можно об этом написать.

Есть таблица c множеством записей (допустим 1M-100M), где есть поле DateTime и индекс на этом поле. Нужно удалить тоже много записей (допустим 10k-500k), которые раньше определенного времени по полю DateTime. Но таблица очень активно используеться в проде. Как сделать удаление с минимальными последствиями для производительности на проде?

Какие у меня мысли возникают:

  • индекс лучше не использовать, так как при удалении большого количества записей вероятно будет полный проход по таблице, где индекс не будет использован, так как это будет быстрее.
    Хотя не знаю этот подход можно настроить или авто постоитель плана сам все придумает по желанию.
  • индекс лучше отключить на время удаления, для того что бы небыло лишних операций перестройки индекса, а после включить. Но не уверен будут ли тут проблемы с нагрузкой на проде?

Есть подходы лучше?

Еще думаю возможно есть тонкости в условии или решении:

  • важно что поле типа DateTime?
  • если таблица будет не большой, то это что-то меняет?
  • может нагрузка на проде быть разной по своей природе, так что на производительность вообще не повлияет удаление или всегда точно повлияет?
  • mysql
  • sql
  • postgresql
  • sql-server
  • oracle

7

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Удаление индексов

    Об объекте

    Учебные материалы

    Правила описания синтаксиса команд SQL

    Создание баз данных

    Выбор базы данных

    Создание таблиц

    Изменение и удаление баз данных и их объектов

    Переименование таблиц

    Модификация типа данных столбца

    Добавление cтолбца

    Создание индексов

    Удаление индексов

    Удаление таблиц

    Удаление баз данных

    Добавление, изменение и удаление данных

    Практические задания

    Вопросы для самопроверки

    Описание базы данных db_sales

    Список литературы


Удаление индексов

MS SQL Server
Для удаления обычных индексов в СУБД MS SQL используется оператор DROP INDEX:

DROP INDEX <index_name> ON <table_name>

Однако оператор DROP INDEX неприменим к первичным ключам (индекс PRIMARY KEY) и уникальным индексам (UNIQUE). Для удаления первичных ключей и уникальных индексов используется оператор ALTER TABLE с предложением DROP CONSTRAINT:

ALTER TABLE <table_name> DROP CONSTRAINT <index_name>

MySQL Server
В СУБД MySQL удаление индексов производится операторами DROP INDEX или ALTER TABLE. Удаление первичных ключей (индексов PRIMARY KEY) осуществляется только с помощью оператора ALTER TABLE. Операторы удаления индексов имеют следующий синтаксис:

DROP INDEX <index_name> ON <bl_name>

ALTER TABLE <tbl_name> DROP INDEX <index_name>

Оператор для удаления индекса PRIMARY KEY имеет синтаксис:

ALTER TABLE <tbl_name> DROP PRIMARY KEY

Если такой индекс с именем PRIMARY KEY создан не был, а таблица имеет один или несколько индексов UNIQUE, будет удален первый из них.

Удаление столбцов из таблицы влияет на индексы. Удаляя столбец из таблицы, вы тем самым удаляете этот столбец из индекса. Удаляя все индексируемые столбцы из таблицы, вы удаляете весь индекс.

Пример

Удалить уникальный индекс client_phone в таблице tbl_clients

MS SQL:*
ALTER TABLE tbl_clients DROP CONSTRAINT client_phone

MySQL:
DROP INDEX client_phone ON tbl_clients
или
ALTER TABLE tbl_clients DROP INDEX client_phone

* В MS SQL не допускает применения оператора DROP INDEX для удаления уникальных индексов.


« Previous | Next »

MySQL Drop Index — javatpoint

следующий → ← предыдущая

MySQL позволяет оператору DROP INDEX удалить существующий индекс из таблицы. Чтобы удалить индекс из таблицы, мы можем использовать следующий запрос:

mysql>DROP INDEX index_name ON table_name [algorithm_option | блокировка_опция];

Если мы хотим удалить индекс, для этого требуются две вещи:

  • Во-первых, мы должны указать имя индекса, который мы хотим удалить.
  • Во-вторых, имя таблицы, к которой относится ваш индекс.

Синтаксис Drop Index содержит две необязательные опции: Algorithm и Lock для чтения и записи таблиц во время модификации индекса. Поясним оба подробно:

Опция алгоритма

Параметр алгоритм_опция позволяет указать конкретный алгоритм удаления индекса в таблице. Синтаксис алгоритм_опция следующий:

Алгоритм [=] {ПО УМОЛЧАНИЮ | ВСТАВИТЬ | КОПИРОВАТЬ}

Синтаксис Drop Index поддерживает в основном два алгоритма: INPLACE и COPY.

COPY: Этот алгоритм позволяет нам копировать одну таблицу в другую новую таблицу строку за строкой, а затем выполнять оператор DROP Index для этой новой таблицы.

В этой таблице мы не можем выполнять инструкции INSERT и UPDATE для манипулирования данными.

INPLACE: Этот алгоритм позволяет нам перестроить таблицу вместо копирования исходной таблицы. Мы можем выполнять все операции по манипулированию данными в этой таблице. В этой таблице MySQL выдает эксклюзивную блокировку метаданных во время удаления индекса.

Примечание. Если вы не определили предложение алгоритма, MySQL использует алгоритм INPLACE. Если INPLACE не поддерживается, используется алгоритм COPY. Алгоритм DEFAULT работает так же, как и без использования какого-либо предложения алгоритма с оператором Drop index.

Вариант блокировки

Этот пункт позволяет нам контролировать уровень одновременных операций чтения и записи во время удаления индекса. Синтаксис lock_option следующий:

БЛОКИРОВКА [=] {ПО УМОЛЧАНИЮ|НЕТ|ОБЩИЙ|ИСКЛЮЧИТЕЛЬНЫЙ}

В синтаксисе мы видим, что lock_option содержит четыре режима : ПО УМОЛЧАНИЮ, НЕТ, ОБЩИЙ и ЭКСКЛЮЗИВНЫЙ. Теперь мы собираемся подробно обсудить все режимы:

SHARED: Этот режим поддерживает только одновременное чтение, но не одновременную запись. Когда одновременные чтения не поддерживаются, выдает ошибку.

ПО УМОЛЧАНИЮ: Этот режим может иметь максимальный уровень параллелизма для указанного алгоритма. Это позволит одновременное чтение и запись, если поддерживается, в противном случае применяется монопольный режим.

НЕТ: У вас есть одновременное чтение и запись, если этот режим поддерживается. В противном случае выдает ошибку.

ЭКСКЛЮЗИВ: Этот режим обеспечивает монопольный доступ.

Пример

Сначала выполните следующую команду, чтобы отобразить индексы, доступные в таблице.

mysql> ПОКАЗАТЬ ИНДЕКСЫ ОТ студента;

Это даст следующий вывод.

В выводе мы видим, что доступны три индекса. Теперь выполните следующую инструкцию, чтобы удалить класс индекс из таблицы студент .

mysql> DROP INDEX class ON student;

Снова выполните оператор SHOW INDEXES, чтобы проверить, удален индекс или нет. После выполнения этого оператора мы получим следующий вывод, в котором доступны только два индекса.

Пример использования алгоритма и блокировки

Следующий оператор удаляет индекс age из таблицы student, используя алгоритм и параметр блокировки.

mysql> DROP INDEX age ON student ALGORITHM = INPLACE LOCK = DEFAULT;

MySQL Drop Индекс ПЕРВИЧНОГО ключа

В некоторых случаях таблица содержит ПЕРВИЧНЫЙ индекс, который создается всякий раз, когда вы создаете таблицу с первичным ключом или уникальным ключом. В этом случае нам нужно выполнить следующую команду, потому что PRIMARY является зарезервированным словом.

mysql> DROP INDEX PRIMARY ON имя_таблицы;

Чтобы удалить индекс первичного ключа из таблицы учащихся, выполните следующую инструкцию:

mysql> DROP INDEX PRIMARY ON student;


Следующая темаПоказать индексы MySQL

← предыдущая следующий →

индексация — Как удалить этот индекс в MySQL?

Задавать вопрос

спросил

Изменено 3 года, 9несколько месяцев назад

Просмотрено 74к раз

Создается так:

 создать списки таблиц(
    id целое число без знака NOT NULL AUTO_INCREMENT,
    accountId целое число без знака по умолчанию ноль,
    заголовок varchar(300) не нулевой,
    страна целое число без знака,
    регион целое число без знака,
    введите целое число без знака,
    целое число цен,
    единица измерения varchar(20) не нулевая,
    ценаUSD десятичная(12,2),
    спальни целое число без знака,
    миниатюра varchar (100) по умолчанию ноль,
    текст ключевых слов,
    созданная дата и время,
    удалено логическое значение по умолчанию 0,
    полнотекстовый индекс (ключевые слова),
    ПЕРВИЧНЫЙ КЛЮЧ (id)
) двигатель=MyISAM;
 

Как удалить тот полнотекстовый индекс, у которого нет имени?

Что делать, если безымянный индекс: полнотекстовый индекс (заголовок, ключевые слова) ?

  • mysql
  • индексация
 ALTER TABLE перечисления DROP INDEX ключевые слова;
 

0

Запустите эту команду в клиенте mysql :

 mysql> SHOW CREATE TABLE listings;
 

Он покажет вам DDL для таблицы, включая присвоенное системой имя для индекса.

1

ALTER TABLE {your_table_name} DROP INDEX {your_index_name}

ИЛИ

DROP INDEX {your_index_name} ON {your_tbl_name}

0

Вы также можете получить информацию об индексе таблицы, используя синтаксис SHOW INDEX.

 ПОКАЗАТЬ ИНДЕКС ИЗ списков;
 

Кроме того, если вы не укажете имя для индекса, MySQL автоматически предоставит имя для индекса на основе индексируемых столбцов.

Для полнотекстового индекса (ключевых слов) MySQL, скорее всего, назовет индекс ключевыми словами .

Для полнотекстового индекса (заголовок, ключевые слова) MySQL, скорее всего, назовет индекс title .

Я говорю «скорее всего», потому что если уже есть индекс с именем keywords или title , MySQL назовет его по-другому.