SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.04.2011 18:33:34

maxist
Участник
Зарегистрирован: 12.04.2011
Сообщений: 5

Mysql insert

Работаю параллельно два человека с одной базой.
Ситуация - два человека с разницей в несколько сек. делают группу insert-ов в разные таблички. При каждой вставке записывается время записи now().
Так как есть разница во времени измеряется в секундах должно быть разное время записи в таблицу также в секундах. но!
Почему в таблице записываетcя время разницы в котором почти нет?
пример - человек А нажал на клавишу сохранить в 10:20:20, человек Б сохранился в 10:20:22;
Обе записи прошли по времени как 10:20:25;

Да, возможно бока в php скрипте. Но тогда должно быть разные интервалы записи.

Если ли в mysql какой-то пул заданий. Где он собирает-собирает, потом все резко выполняет? Проблема в том, что от записи которую сохраняет человек А, зависит номер документа под которым сохраняет человек Б.
А когда время одинаковое то номера документов так - же одинаковые...

Неактивен

 

#2 12.04.2011 21:34:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Mysql insert

Скорее всего, проблема действительно в PHP. Но нельзя делать номер
документа по времени в любом случае — плохое решение. Если два
человека действительно выполнят INSERT одновременно (в течение
одной секунды) — Вы даже в случае починенного PHP получите ошибку.
Имеет смысл делать документы каким-то независимым способом. Обыч-
но, это просто автоинкрементное число.

Неактивен

 

#3 12.04.2011 23:04:33

maxist
Участник
Зарегистрирован: 12.04.2011
Сообщений: 5

Re: Mysql insert

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)

Неактивен

 

#4 15.04.2011 20:42:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Mysql insert

Можно, конечно, никто не запрещает smile

Индексируется сразу, при вставке. Даты у Вас уникальны далеко не практически
всегда, как мы видим из cardinality smile

Пересчитать cardinality MyISAM можно с помощью команды ANALYZE TABLE tablename.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson