[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]

Ответить