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

Когда нужно много индексов, что делать?

Имеется вот такая структура таблицы

CREATE TABLE `tb_visitors` (
  `id` int(11) UNSIGNED NOT NULL,
  `idad` int(11) UNSIGNED NOT NULL,
  `idus` int(11) UNSIGNED NOT NULL,
  `ip` int(10) UNSIGNED NOT NULL,
  `date` int(10) UNSIGNED NOT NULL,
  `status` enum('0','1') NOT NULL DEFAULT '0'
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COMMENT='Запись визитов';

--
-- Индексы сохранённых таблиц
--

ALTER TABLE `tb_visitors`
  ADD PRIMARY KEY (`id`),
  ADD KEY `status` (`status`),
  ADD KEY `idad` (`idad`),
  ADD KEY `idus` (`idus`),
  ADD KEY `ip` (`ip`);


Запросы SELECT в этом случае работают отлично. Но вот когда дело доходит до

DELETE FROM `tb_visitors` WHERE `status` = '1' AND `date` < '".time()."'


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

Вот в чём вопрос: что можно сделать в этом случае ? Тупо выставить индекс на date или менять всё ?
  • Вопрос задан
  • 299 просмотров
Подписаться 3 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Строить только те индексы, которые необходимы. Каждая операция вставки/изменения/удаления - это перестроение индексов. Чем больше индексов - тем дольше выполняются эти операции. Пока скорость выборки достаточна без использования индексов, их строить не надо.
При массовом изменении можно предварительно отключать индексы, после изменения снова включать.
LOCK TABLES `table` WRITE;
ALTER TABLE `table` DISABLE KEYS;
INSERT/UPDATE/DELETE ...
ALTER TABLE `table` ENABLE KEYS;
UNLOCK TABLES;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы