-- есть таблица
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]