-- есть таблица

DROP TABLE IF EXISTS `test`;
CREATE TABLE IF NOT EXISTS `test` (
  `DT` datetime NOT NULL,
  `PAR_TYPE` int(11) NOT NULL,
  `REC_NO` int(11) NOT NULL,
  KEY `DT` (`DT`, `PAR_TYPE`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


-- и в ней данные
INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
  VALUES ('2007-05-17 10:04:56', 1, 1);
INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
   VALUES ('2007-05-17 10:04:56', 1, 2);
INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
   VALUES ('2007-05-17 10:04:56', 2, 3);
INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
   VALUES ('2007-05-17 10:04:56', 1, 4);
INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
   VALUES ('2007-05-17 10:04:56', 1, 5);

-- читаем всю таблицу
-- данных мало - индекс не используется

select * from `test` order by `DT`;
+---------------------+----------+--------+
| DT                  | PAR_TYPE | REC_NO |
+---------------------+----------+--------+
| 2007-05-17 10:04:56 |        1 |      1 |
| 2007-05-17 10:04:56 |        1 |      2 |
| 2007-05-17 10:04:56 |        2 |      3 |
| 2007-05-17 10:04:56 |        1 |      4 |
| 2007-05-17 10:04:56 |        1 |      5 |
+---------------------+----------+--------+
5 rows in set (0.00 sec)


-- добавляем limit
select * from `test` order by `DT` limit 3;
+---------------------+----------+--------+
| DT                  | PAR_TYPE | REC_NO |
+---------------------+----------+--------+
| 2007-05-17 10:04:56 |        1 |      1 |
| 2007-05-17 10:04:56 |        1 |      2 |
| 2007-05-17 10:04:56 |        1 |      4 | <<< !!! строка 4, а не 3
+---------------------+----------+--------+

explain показывает что с limit-ом включился index (DT,PAR_TYPE)


-- хотим удалить первые 3 строки
delete from `test` order by `DT` limit 3;
-- и смотрим что осталось
select * from `test`;

+---------------------+----------+--------+
| DT                  | PAR_TYPE | REC_NO |
+---------------------+----------+--------+
| 2007-05-17 10:04:56 |        1 |      4 |
| 2007-05-17 10:04:56 |        1 |      5 |
+---------------------+----------+--------+

видим что delete несмотря на limit не использовал index
и 3 строка
1) не попала в выборку, то есть не была обработана
2) но была удалена
---
итого: 3 строка - зомби


Получается что нельзя использовать периодическую чистку старых записей таблицы в таком стиле:
select ... order by `data_field` limit N;
delete ... order by `data_field` limit N;
если поле `data_field` - часть составного индекса?

так? или это смахивает на ошибку в mysqld 5.0.32-Debian_7-log



--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Ответить