SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.03.2009 17:02:03

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

TRUNCATE выполняется очень долго

Столкнулся с интересной проблемой TRUNCATE выполняется ОЧЕНЬ долго:


TRUNCATE TABLE aktion;
1118 sec.
 

замена на DELETE FROM aktion; никакой пользы тоже не приносит.

Сама таблица (около 100.000 записей):

CREATE TABLE `aktion` (
  `Prim` int(11) NOT NULL auto_increment,
  `kkreis` char(3) default NULL,
  `JJMNr` varchar(10) NOT NULL,
  `Preis` double NOT NULL default '0',
  `Menge` int(11) NOT NULL default '0',
  `Ablauf` bigint(20) NOT NULL default '0',
  PRIMARY KEY  (`Prim`),
  KEY `kkreis` (`kkreis`),
  KEY `JJMNr` (`JJMNr`),
  KEY `Menge` (`Menge`),
  KEY `Ablauf` (`Ablauf`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=199899 ;
 

Скрипт запускается ночью, когда по-сути к таблице никто не обращается.

TRUNCATE других таблиц проходит в это время из этого-же скрипта на ура.

П.С. После очистки таблицы происходит вставка

INSERT INTO aktion (Prim,kkreis,JJMNr,Preis,Menge,Ablauf) VALUES (...)
 

Отредактированно vaspet (11.03.2009 17:03:33)

Неактивен

 

#2 11.03.2009 20:08:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: TRUNCATE выполняется очень долго

Табличка MyISAM — вполне возможно, что она занята какими-то действиями.
TRUNCATE пересоздает табличку, а для этого к ней нужен эксклюзивный доступ.
Если при этом табличка занята, то он ждет.

Неактивен

 

#3 12.03.2009 11:45:16

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: TRUNCATE выполняется очень долго

А как бы мне получить к ней эксклюзивный доступ?

Такое прокатит?
- пользуемся таблицей (почти только SELECT)
- в 2:30 БЛОКИРУЕМ к ней доступ
- TRUNCATE                // удаляем
- INSERT                     // обновляем
- 2:32 РАЗБЛОКИРУЕМ табличку
- // можно дальше пользоватся

Как (РАЗ)БЛОКИРОВАТЬ?


TRUNCATE TABLE aktion;
186 sec.
LOCK TABLES aktion WRITE;
0 sec.
INSERT INTO aktion (Prim,kkreis,JJMNr,Preis,Menge,Ablauf) VALUES (...)
19 sec.
UNLOCK TABLES;
 

не особо помогло.
А если "LOCK TABLES" поставить перед "TRUNCATE TABLE", то очистка не произойдет?

Отредактированно vaspet (12.03.2009 11:45:33)

Неактивен

 

#4 12.03.2009 14:55:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: TRUNCATE выполняется очень долго

vaspet написал:

А если "LOCK TABLES" поставить перед "TRUNCATE TABLE", то очистка не произойдет?

Произойдет ошибка, так как в рамках транзакции или явной блокировки нельзя осуществить операцию truncate.

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

P.S. Подробнее о блокировках можно посмотреть http://sqlinfo.ru/articles/info/10.html

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson