[EMAIL PROTECTED] -> [email protected] @ Thu, 17 May 2007
11:11:29 +0400:
r> -- есть таблица
r> DROP TABLE IF EXISTS `test`;
r> CREATE TABLE IF NOT EXISTS `test` (
r> `DT` datetime NOT NULL,
r> `PAR_TYPE` int(11) NOT NULL,
r> `REC_NO` int(11) NOT NULL,
r> KEY `DT` (`DT`, `PAR_TYPE`)
r> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
r> -- и в ней данные
r> INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
r> VALUES ('2007-05-17 10:04:56', 1, 1);
r> INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
r> VALUES ('2007-05-17 10:04:56', 1, 2);
r> INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
r> VALUES ('2007-05-17 10:04:56', 2, 3);
r> INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
r> VALUES ('2007-05-17 10:04:56', 1, 4);
r> INSERT INTO `test` (`DT`, `PAR_TYPE`, `REC_NO`)
r> VALUES ('2007-05-17 10:04:56', 1, 5);
r> -- читаем всю таблицу
r> -- данных мало - индекс не используется
r> select * from `test` order by `DT`;
r> +---------------------+----------+--------+
r> | DT | PAR_TYPE | REC_NO |
r> +---------------------+----------+--------+
r> | 2007-05-17 10:04:56 | 1 | 1 |
r> | 2007-05-17 10:04:56 | 1 | 2 |
r> | 2007-05-17 10:04:56 | 2 | 3 |
r> | 2007-05-17 10:04:56 | 1 | 4 |
r> | 2007-05-17 10:04:56 | 1 | 5 |
r> +---------------------+----------+--------+
r> 5 rows in set (0.00 sec)
r> -- добавляем limit
r> select * from `test` order by `DT` limit 3;
r> +---------------------+----------+--------+
r> | DT | PAR_TYPE | REC_NO |
r> +---------------------+----------+--------+
r> | 2007-05-17 10:04:56 | 1 | 1 |
r> | 2007-05-17 10:04:56 | 1 | 2 |
r> | 2007-05-17 10:04:56 | 1 | 4 | <<< !!! строка 4, а не 3
r> +---------------------+----------+--------+
r> explain показывает что с limit-ом включился index (DT,PAR_TYPE)
r> -- хотим удалить первые 3 строки
r> delete from `test` order by `DT` limit 3;
r> -- и смотрим что осталось
r> select * from `test`;
r> +---------------------+----------+--------+
r> | DT | PAR_TYPE | REC_NO |
r> +---------------------+----------+--------+
r> | 2007-05-17 10:04:56 | 1 | 4 |
r> | 2007-05-17 10:04:56 | 1 | 5 |
r> +---------------------+----------+--------+
r> видим что delete несмотря на limit не использовал index
r> и 3 строка
r> 1) не попала в выборку, то есть не была обработана
r> 2) но была удалена
r> ---
r> итого: 3 строка - зомби
r> Получается что нельзя использовать периодическую чистку старых записей
таблицы
r> в таком стиле:
r> select ... order by `data_field` limit N;
r> delete ... order by `data_field` limit N;
r> если поле `data_field` - часть составного индекса?
r> так? или это смахивает на ошибку в mysqld 5.0.32-Debian_7-log
Использовать индексы консистентно никто никому не обещал. Тем более -
частичные. Обещали только соответствие результата запроса его тексту.
Так что никакой ошибки, кроме пользовательской, я тут не наблюдаю.
--
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: [EMAIL PROTECTED]
Секретный ключ, известный более чем одной персоне, называется публичным.
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]