Задавайте вопросы, мы ответим
Вы не зашли.
Работаю параллельно два человека с одной базой.
Ситуация - два человека с разницей в несколько сек. делают группу insert-ов в разные таблички. При каждой вставке записывается время записи now().
Так как есть разница во времени измеряется в секундах должно быть разное время записи в таблицу также в секундах. но!
Почему в таблице записываетcя время разницы в котором почти нет?
пример - человек А нажал на клавишу сохранить в 10:20:20, человек Б сохранился в 10:20:22;
Обе записи прошли по времени как 10:20:25;
Да, возможно бока в php скрипте. Но тогда должно быть разные интервалы записи.
Если ли в mysql какой-то пул заданий. Где он собирает-собирает, потом все резко выполняет? Проблема в том, что от записи которую сохраняет человек А, зависит номер документа под которым сохраняет человек Б.
А когда время одинаковое то номера документов так - же одинаковые...
Неактивен
Скорее всего, проблема действительно в PHP. Но нельзя делать номер
документа по времени в любом случае — плохое решение. Если два
человека действительно выполнят INSERT одновременно (в течение
одной секунды) — Вы даже в случае починенного PHP получите ошибку.
Имеет смысл делать документы каким-то независимым способом. Обыч-
но, это просто автоинкрементное число.
Неактивен
autoincrement не получится. В нем происходит нумерация для каждого отдельного типа документа, и вычисляется независимо. К тому же номера сбрасываются каждый месяц.
paulus написал:
Вы даже в случае починенного PHP получите ошибку
А почему получу ошибку? Для каждого скрипта - создается свое подключение. Просто заблокируется таблица, пока будет делать один скрипт вставку.
Я думал вот в другом направлении.
Можно ли создать триггер или процедуру, которая будет проверять это поле на уникальность? Допустим если есть такое значение за последний день то прерываться, и возвращает ошибку или еще что-то.Чтобы скрипт это отловил, и выполнился повторно, но с новыми данными.
Увы, структуру таблиц менять нельзя. Наследие тяжелое.
____
Вот еще вопрос как быстро индексируется запись в таблице после insert? Если индекс стоит на поле date.
Непроиндексированное поле участвует в выборке date between "d1" and "d2"?
Вот таблица индексов:
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| jurnal | 0 | PRIMARY | 1 | id | A | 412798 | NULL | NULL | | BTREE | | |
| jurnal | 1 | idate | 1 | date | A | 9276 | NULL | NULL | | BTREE | | |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
Почему Cardinality индекса ID захватывает все записи, а индекс idate - только 9 тысяч? Ведь дата - практически всегда уникальна. Кроме случаев когда происходить одновременная запись (что явно не в 31 тысячи записей). Тип таблицы MyISAM
Отредактированно maxist (12.04.2011 23:24:53)
Неактивен
Можно, конечно, никто не запрещает
Индексируется сразу, при вставке. Даты у Вас уникальны далеко не практически
всегда, как мы видим из cardinality
Пересчитать cardinality MyISAM можно с помощью команды ANALYZE TABLE tablename.
Неактивен